问题标签 [readdirectorychangesw]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
797 浏览

c# - .NET 如何将 FileSystemWatcher 与 ReadDirectoryChangesW 结合起来监视文件夹/文件的打开?

我目前正在使用 FileSystemWatcher 来监视我的本地文件系统更改,但我想监视文件夹/文件的打开。经过大量调查,我发现这可以使用 ReadDirectoryChangesW 完成,但我不能将此方法与 FileSystemWatcher 一起使用。我的问题是如何将 ReadDirectoryChangesW 与 FileSystemWatcher 与有关如何执行此操作的示例代码结合起来。

0 投票
1 回答
1166 浏览

c++ - 异步 ReadDirectoryChangesW 调用阻止线程退出

介绍:

我正在编写一个小应用程序来监视某个目录中新添加的文件。

我想把监控代码放在一个单独的线程中,这样我就可以让主线程腾出来做其他事情,并在需要时取消监控线程。

相关信息:

  • 我正在使用ReadDirectoryChangesW进行监控
  • 我正在使用原始 WIN32 API 进行线程创建/同步
  • 我正在尝试支持 Windows XP。

问题:

我能够正确编码所有内容,除了一件事:

我无法正确退出监控线程,因此这篇文章。

我在主线程中发出一个事件对象的信号,等待线程退出,然后进行清理。

问题在于我的使用,ReadDirectoryChangesW因为在我注释掉那段代码后一切正常。

一旦事件句柄发出信号,ReadDirectoryChangesW就阻止线程“捕获”事件并退出。如果我在它“解除阻塞”的目录中添加一个新文件ReadDirectoryChangesW,线程“捕获”事件并退出。

为了进一步提供帮助,我在下面制作了一个小的MVCE,它说明了我到目前为止所说的内容。

MVCE:

我要解决的问题:

  • 我已经将OVERLAPPED结构从线程移到传递给线程的结构中。然后我设置OVERLAPPED.hEvent强制“解锁” ReadDirectoryChangesW。这似乎可行,但让我感到害怕,因为我认为它不安全/容易出错,因为它没有记录。

  • 我曾尝试使用完成例程,但没有成功,因为我对这一切都很陌生。我能够接收到通知,但是ReadDirectoryChangesW在第一次通过后,缓冲区的内容(用 填充的内容)没有被正确读取。我仍在尝试自己完成这项工作,但可以使用帮助。

  • 我可以使用 I/O 完成端口,但由于我将只监视一个目录,我认为这有点矫枉过正。如果我弄错了,请指导我如何为我的案例使用 I/O 完成端口,我很想尝试一下。

问题:

鉴于上面的 MVCE,您能否指导我如何修改线程过程中的代码,使其正确退出(不ReadDirectoryChangesW阻塞)。

我有一种感觉,我将不得不使用完成例程。在那种情况下,我会谦虚地要求一些伪代码或书面说明,因为这是我第一次使用它们。

每次我取得进展时,我都会相应地用相关数据更新这篇文章。

0 投票
2 回答
5211 浏览

c++ - 在循环中异步使用 ReadDirectoryChangesW

介绍:

我正在尝试在循环中异步使用ReadDirectoryChangesW 。

下面的片段说明了我想要实现的目标:

问题:

我不知道如何处理代码返回ReadDirectoryChangesW时的情况。FALSEGetLastError()ERROR_IO_PENDING

在这种情况下,我应该继续循环并继续循环,直到我可以处理ReadDirectoryChangesW返回。buffer

我为解决这个问题所做的努力:

我尝试过使用WaitForSingleObject(ovl.hEvent, 1000),但它因错误而崩溃1450 ERROR_NO_SYSTEM_RESOURCES。以下是重现此行为的 MVCE:

通读文档,似乎我需要将最后一个参数设置为的GetOverlappedResultFALSE ,但我不知道如何正确使用此 API。

问题:

由于 MVCE 很好地说明了我正在尝试做什么(打印新添加文件的名称),你能告诉我必须在while循环中修复什么才能使其工作吗?

同样,重点是ReadDirectoryChangesW在循环中异步使用,如 INTRODUCTION 中的片段所示。

0 投票
0 回答
132 浏览

c++ - MSDN - ReadDirectoryChangesW 不递归


我在我的 C++ 程序的一个线程中运行ReadDirectoryChangesW 。不幸的是,即使我已将 bWatchSubtree 参数设置为 TRUE,我也只会在根目录中的文件发生更改时收到通知。

文档说:
bWatchSubtree [in]
如果此参数为 TRUE,则该函数监视以指定目录为根的目录树。如果此参数为 FALSE,则该函数仅监视由 hDirectory 参数指定的目录。

我错过了什么?

谢谢!
kk

0 投票
0 回答
291 浏览

python - ReadDirectoryChangesW 所有动作

我正在使用 Tim Golden 的代码使用 ReadDirectoryChangesW 函数读取目录更改( http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html )。在他的代码中,有一个枚举,其中包括函数 ReadDirectoryChangesW 返回的 5 种类型的操作:1:“已创建”,2:“已删除”,3:“已更新”,4:“从某事重命名”,5:“重命名”对某事”

我想知道这个枚举是否有更多选项可以添加。我想看看文件大小是否有变化,属性是否有变化,在这段代码中,两者都是“更新的”枚举。但我想从函数中为每次更新获取不同的 int。另外,如果函数返回的值更多,我也想看看!谢谢!

0 投票
1 回答
1840 浏览

c++ - C++ 使用 ReadDirectoryChangesW 监视文件更改不会触发所有操作?

我有一个应用程序必须监视特定目录中的任何更改。我使用以下代码,但是,例如,当我重命名文件时,FILE_ACTION_RENAMED_NEW_NAME不会触发 Action。实际上,UNDISCOVERED ACTION触发了导致意外行为的get?我在这里做错了什么?

在名为的地图中将文件从 重命名为 的一些示例file.txt输出:file2.txtMAP

0 投票
2 回答
720 浏览

c++ - c ++ ReadDirectoryChangesW在目录上,带有目录的符号链接

我有一个应用程序,用于监视目录中的文件/目录更改。但是,此目录还包含symlinks其他目录(可访问)。但是,当我file在目录中修改 a 时,不会触发symlink通知。例如,当我监控时:Root

但是,当我监视时Root/SDir,这是符号链接目录,而不是 File2 上的触发器正常工作。例如:

因此,当symlink directory不是根目录时,它不会触发该目录中的文件更改。但是,当我将其设置symlink directory为根时,它工作正常。是的, 中的bWatchSubtree参数ReadDirectoryChangesW-function设置为true

CreateFile为了良好的顺序,我使用以下函数打开目录句柄:

那么,如果相同的符号链接不是 symlink 的根,为什么触发器不会对符号链接中的文件起作用ReadDirectoryChangesW

0 投票
1 回答
262 浏览

c++ - C++ ReadDirectoryChangesW 和 Boost 将目录更改作为文件(旧名称)返回

我有一个应用程序正在监视目录的更改。但是,当我重命名目录时,假设将目录 A 更改为目录 B,我将看到以下输出结果:

虽然我期望输出:

这种情况也发生在删除目录时,给出输出:

虽然我期望输出:

我用来获取此输出的代码(使用 Boost 的文件系统)是:

我在这里做错了什么?

0 投票
1 回答
354 浏览

c++ - 如果之前调用了 CancelIo,ReadDirectoryChangesW 将失败并出现错误 995

我对 ReadDirectoryChangesW 失败并出现错误 995 的奇怪行为感到困惑。场景解释如下。

  1. FileHandle 是使用 CreateFileW 获得的。

  2. 在步骤 1 中获得的 FileHandle 用于 ReadDirectoryChangesW。它成功并将请求发送到服务器

  3. 轮询 10 秒,如果服务器没有生成更改通知,则使用 cancelIo 取消 chnagenotify 请求。它发送取消和服务器响应。

  4. 现在再次使用在步骤 1 中获得的文件句柄通过 ReadDirectoryChangesW 设置更改通知,它失败并显示“995 - 由于线程退出或应用程序请求,I/O 操作已中止”。此步骤未向服务器发送实际请求。

  5. 立即使用在步骤 1 中获得的文件句柄再次调用 ReadDirectoryChangesW 并成功并向服务器发送请求。

步骤 3、4、5 在循环中重复,每个备用的 ReadDirectoryChangesW 都会失败,并返回 995,并且下一个会立即成功。

谁能告诉我发生了什么事?下面是代码

以下是示例 O/P:

向服务器发送更改通知

已取消的待处理请求。

向服务器发送更改通知

已取消的待处理请求。

向服务器发送更改通知失败。

向服务器发送更改通知

已取消的待处理请求。

向服务器发送更改通知失败。

向服务器发送更改通知

已取消的待处理请求。

向服务器发送更改通知失败。

向服务器发送更改通知

0 投票
2 回答
2994 浏览

python - ReadDirectoryChangesW 无法检测和处理监视目录的删除

我尝试监视目录树的内容,其中包含大量文件(例如许多目录,每个目录有 9000 个文件)。

同步模式:

我首先尝试在阻塞模式(同步)下使用ReadDirectoryChangesW,但是当我删除监视的目录时,我最终陷入了死锁,我无法检测到也无法退出。

当监视目录被删除时,似乎没有办法避免调用阻塞?

此外,由于该函数在线程中运行,因此在死锁时我无法从“主管”线程中将其杀死,该线程将监视父目录以在监视目录上执行 DELETE 操作,我真的不喜欢这是一个好的解决方案,因为它涉及很多更多代码。

A同步模式:

然后我尝试了重叠模式(异步),它不会在死锁中阻塞,但是当删除目录时,我无法检测到目录句柄何时变为无效。WaitForSingleObject调用超时,使用os.path.isdir检查目录是否存在无济于事,因为如果同时重新创建目录,它不会返回 False,但旧目录句柄仍然无效,并且会未检测到新创建的同名目录中的更改。

经过几天尝试各种方法后,我终于得到了这段代码,但是它不能完美地工作,因为它仍然没有检测到监视目录的删除,并且在快速大量删除文件时它也会丢失一些文件。同步模式没有的东西。

有没有办法处理删除监视目录的检测,而不仅仅是删除win32con.FILE_SHARE_DELETE标志?