问题标签 [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.
c# - .NET 如何将 FileSystemWatcher 与 ReadDirectoryChangesW 结合起来监视文件夹/文件的打开?
我目前正在使用 FileSystemWatcher 来监视我的本地文件系统更改,但我想监视文件夹/文件的打开。经过大量调查,我发现这可以使用 ReadDirectoryChangesW 完成,但我不能将此方法与 FileSystemWatcher 一起使用。我的问题是如何将 ReadDirectoryChangesW 与 FileSystemWatcher 与有关如何执行此操作的示例代码结合起来。
c++ - 异步 ReadDirectoryChangesW 调用阻止线程退出
介绍:
我正在编写一个小应用程序来监视某个目录中新添加的文件。
我想把监控代码放在一个单独的线程中,这样我就可以让主线程腾出来做其他事情,并在需要时取消监控线程。
相关信息:
- 我正在使用ReadDirectoryChangesW进行监控
- 我正在使用原始 WIN32 API 进行线程创建/同步
- 我正在尝试支持 Windows XP。
问题:
我能够正确编码所有内容,除了一件事:
我无法正确退出监控线程,因此这篇文章。
我在主线程中发出一个事件对象的信号,等待线程退出,然后进行清理。
问题在于我的使用,ReadDirectoryChangesW
因为在我注释掉那段代码后一切正常。
一旦事件句柄发出信号,ReadDirectoryChangesW
就阻止线程“捕获”事件并退出。如果我在它“解除阻塞”的目录中添加一个新文件ReadDirectoryChangesW
,线程“捕获”事件并退出。
为了进一步提供帮助,我在下面制作了一个小的MVCE,它说明了我到目前为止所说的内容。
MVCE:
我要解决的问题:
我已经将
OVERLAPPED
结构从线程移到传递给线程的结构中。然后我设置OVERLAPPED.hEvent
强制“解锁”ReadDirectoryChangesW
。这似乎可行,但让我感到害怕,因为我认为它不安全/容易出错,因为它没有记录。我曾尝试使用完成例程,但没有成功,因为我对这一切都很陌生。我能够接收到通知,但是
ReadDirectoryChangesW
在第一次通过后,缓冲区的内容(用 填充的内容)没有被正确读取。我仍在尝试自己完成这项工作,但可以使用帮助。我可以使用 I/O 完成端口,但由于我将只监视一个目录,我认为这有点矫枉过正。如果我弄错了,请指导我如何为我的案例使用 I/O 完成端口,我很想尝试一下。
问题:
鉴于上面的 MVCE,您能否指导我如何修改线程过程中的代码,使其正确退出(不ReadDirectoryChangesW
阻塞)。
我有一种感觉,我将不得不使用完成例程。在那种情况下,我会谦虚地要求一些伪代码或书面说明,因为这是我第一次使用它们。
每次我取得进展时,我都会相应地用相关数据更新这篇文章。
c++ - 在循环中异步使用 ReadDirectoryChangesW
介绍:
我正在尝试在循环中异步使用ReadDirectoryChangesW 。
下面的片段说明了我想要实现的目标:
问题:
我不知道如何处理代码返回ReadDirectoryChangesW
时的情况。FALSE
GetLastError()
ERROR_IO_PENDING
在这种情况下,我应该继续循环并继续循环,直到我可以处理ReadDirectoryChangesW
返回。buffer
我为解决这个问题所做的努力:
我尝试过使用WaitForSingleObject(ovl.hEvent, 1000)
,但它因错误而崩溃1450 ERROR_NO_SYSTEM_RESOURCES
。以下是重现此行为的 MVCE:
通读文档,似乎我需要将最后一个参数设置为的GetOverlappedResultFALSE
,但我不知道如何正确使用此 API。
问题:
由于 MVCE 很好地说明了我正在尝试做什么(打印新添加文件的名称),你能告诉我必须在while
循环中修复什么才能使其工作吗?
同样,重点是ReadDirectoryChangesW
在循环中异步使用,如 INTRODUCTION 中的片段所示。
c++ - MSDN - ReadDirectoryChangesW 不递归
我在我的 C++ 程序的一个线程中运行ReadDirectoryChangesW 。不幸的是,即使我已将 bWatchSubtree 参数设置为 TRUE,我也只会在根目录中的文件发生更改时收到通知。
文档说:
bWatchSubtree [in]
如果此参数为 TRUE,则该函数监视以指定目录为根的目录树。如果此参数为 FALSE,则该函数仅监视由 hDirectory 参数指定的目录。
我错过了什么?
谢谢!
kk
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。另外,如果函数返回的值更多,我也想看看!谢谢!
c++ - C++ 使用 ReadDirectoryChangesW 监视文件更改不会触发所有操作?
我有一个应用程序必须监视特定目录中的任何更改。我使用以下代码,但是,例如,当我重命名文件时,FILE_ACTION_RENAMED_NEW_NAME
不会触发 Action。实际上,UNDISCOVERED ACTION
触发了导致意外行为的get?我在这里做错了什么?
在名为的地图中将文件从 重命名为 的一些示例file.txt
输出:file2.txt
MAP
c++ - c ++ ReadDirectoryChangesW在目录上,带有目录的符号链接
我有一个应用程序,用于监视目录中的文件/目录更改。但是,此目录还包含symlinks
其他目录(可访问)。但是,当我file
在目录中修改 a 时,不会触发symlink
通知。例如,当我监控时:Root
但是,当我监视时Root/SDir
,这是符号链接目录,而不是 File2 上的触发器正常工作。例如:
因此,当symlink directory
不是根目录时,它不会触发该目录中的文件更改。但是,当我将其设置symlink directory
为根时,它工作正常。是的, 中的bWatchSubtree
参数ReadDirectoryChangesW-function
设置为true
。
CreateFile
为了良好的顺序,我使用以下函数打开目录句柄:
那么,如果相同的符号链接不是 symlink 的根,为什么触发器不会对符号链接中的文件起作用ReadDirectoryChangesW
?
c++ - C++ ReadDirectoryChangesW 和 Boost 将目录更改作为文件(旧名称)返回
我有一个应用程序正在监视目录的更改。但是,当我重命名目录时,假设将目录 A 更改为目录 B,我将看到以下输出结果:
虽然我期望输出:
这种情况也发生在删除目录时,给出输出:
虽然我期望输出:
我用来获取此输出的代码(使用 Boost 的文件系统)是:
我在这里做错了什么?
c++ - 如果之前调用了 CancelIo,ReadDirectoryChangesW 将失败并出现错误 995
我对 ReadDirectoryChangesW 失败并出现错误 995 的奇怪行为感到困惑。场景解释如下。
FileHandle 是使用 CreateFileW 获得的。
在步骤 1 中获得的 FileHandle 用于 ReadDirectoryChangesW。它成功并将请求发送到服务器
轮询 10 秒,如果服务器没有生成更改通知,则使用 cancelIo 取消 chnagenotify 请求。它发送取消和服务器响应。
现在再次使用在步骤 1 中获得的文件句柄通过 ReadDirectoryChangesW 设置更改通知,它失败并显示“995 - 由于线程退出或应用程序请求,I/O 操作已中止”。此步骤未向服务器发送实际请求。
立即使用在步骤 1 中获得的文件句柄再次调用 ReadDirectoryChangesW 并成功并向服务器发送请求。
步骤 3、4、5 在循环中重复,每个备用的 ReadDirectoryChangesW 都会失败,并返回 995,并且下一个会立即成功。
谁能告诉我发生了什么事?下面是代码
以下是示例 O/P:
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知失败。
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知失败。
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知失败。
向服务器发送更改通知
python - ReadDirectoryChangesW 无法检测和处理监视目录的删除
我尝试监视目录树的内容,其中包含大量文件(例如许多目录,每个目录有 9000 个文件)。
同步模式:
我首先尝试在阻塞模式(同步)下使用ReadDirectoryChangesW,但是当我删除监视的目录时,我最终陷入了死锁,我无法检测到也无法退出。
当监视目录被删除时,似乎没有办法避免调用阻塞?
此外,由于该函数在线程中运行,因此在死锁时我无法从“主管”线程中将其杀死,该线程将监视父目录以在监视目录上执行 DELETE 操作,我真的不喜欢这是一个好的解决方案,因为它涉及很多更多代码。
A同步模式:
然后我尝试了重叠模式(异步),它不会在死锁中阻塞,但是当删除目录时,我无法检测到目录句柄何时变为无效。WaitForSingleObject调用超时,使用os.path.isdir检查目录是否存在无济于事,因为如果同时重新创建目录,它不会返回 False,但旧目录句柄仍然无效,并且会未检测到新创建的同名目录中的更改。
经过几天尝试各种方法后,我终于得到了这段代码,但是它不能完美地工作,因为它仍然没有检测到监视目录的删除,并且在快速大量删除文件时它也会丢失一些文件。同步模式没有的东西。
有没有办法处理删除监视目录的检测,而不仅仅是删除win32con.FILE_SHARE_DELETE标志?