问题标签 [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 投票
0 回答
398 浏览

c++ - 为什么在监视目录中创建子目录时未正确触发 ReadDirectoryChangesW?

(用更简单的代码更新)

我正在使用 ReadDirectoryChangesW() 来监视对某些文件夹的更改。在其中一个监视文件夹中创建文件时,它可以正常工作,但是在创建子目录,它永远不会收到通知。

例如,如果我查看路径 c:\testA\testB 并在该文件夹中创建一个文件,则 ReadDirectoryChangesW() 可以正常工作。如果我改为在该文件夹中创建一个目录,则 WaitForSingleObjectEx 永远不会返回。

有趣的是,如果我改为观看 c:\testA 并在 c:\testA\testB 下创建一个目录,那么 WaitForSingleObjectEx 会按预期返回。请注意,我没有看子文件夹,(bWatchSubtree == false)所以这个结果很奇怪。

一种可能的解决方案是为我要监视的每个文件夹监视两个文件夹,文件夹本身用于文件更改,父文件夹用于任何子目录更改,但是您可以看到为什么这很乏味。

这是一些重现问题的示例代码:

运行此代码并在 c:\testA\testB\newfile.txt创建一个新文件会产生以下输出:

运行此代码并在 c:\testA\testB\newdir 创建一个新目录永远不会被唤醒。

为什么创建目录会导致两个文件夹的通知?为什么不只是父母?为什么创建文件和创建文件夹的行为完全不同?

0 投票
2 回答
238 浏览

c++ - 如何删除被 ReadDirectoryChangesW 监控的孩子的父母

使用 ReadDirectoryChangesW 监视文件夹会导致其父级被锁定且无法删除。

这里有一篇关于这个的帖子:

FindFirstChangeNotification 锁定父文件夹

但其中提到的唯一解决方案是我们应该始终在顶层倾听。

有没有人找到更好的方法来做到这一点,而不是在顶层观看?

有时这可以一直到观看驱动器,并且不会在机器上花费很多处理时间。

谢谢!

0 投票
1 回答
593 浏览

python - 当文件更新时,用于监视目录的 Python 脚本会触发两次。为什么?

简短版本:我编写/改编的 Python 脚本,用于在修改文件时监视目录的更改触发两次。为什么?

长版:

我正在编写一些 Python 代码来监视目录及其子目录的更改。

我从http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html的“使用 ReadDirectoryChanges API”部分中的示例开始

(出于企业 IT 的原因,我不适合使用 Python Watchdog 包。)

从那里的例子中剪切和粘贴:

一般来说,这个例子工作正常,做我想做的事。特别是,它在创建文件时工作正常。然而,当一个文件被编辑/修改/更新时,最后的打印语句(代表我真正想做的动作)会触发两次。

为什么会这样?以及如何防止它,或者至少解决它?我有过的最好的想法是第一次为 True 而第二次为 False 的标志。然而,这感觉就像一个杂牌。

关于一个可能相关的问题,我在哪里可以找到有关 win32con 包和 Microsoft ReadDirectoryChanges API 的文档?我做了一些谷歌搜索,但没有发现任何我认为有用的东西。

哦,是的 - 我在 Windows 7 Enterprise 上运行 Python 3.5.1。

编辑:好的,看起来我所看到的可能是 ReadDirectoryChangesW() 所固有的。我发现这个 StackOverflow 线程似乎基本上是相同的问题,除了原始海报使用的是 C++,而不是 Python。C++ WinApi:ReadDirectoryChangesW() 接收双重通知

0 投票
0 回答
65 浏览

c++ - ReadDirectoryChanges 缓冲区对齐问题错误 998 Windows

我有以下代码来监视系统上的文件更改,但我收到错误代码 998 (INVALID MEMORY LOCATION)。我的代码有什么问题?它应该与缓冲区对齐有关,但我找不到我的编码错误?

我用来监控系统变化的代码如下所示:

请指教我的错误

0 投票
0 回答
48 浏览

python - 通过 Python 观看 TXT 文件更新

我正在开发一个 python 程序,它应该等待另一个程序更新.txt文件,当文件更新时,我的程序应该打开它,获取另一个程序刚刚发出的命令,然后运行其他程序。我对python很陌生,所以一个通用但解释清楚的解决方案会很棒。

我找到了如何查看文件以进行更改?这导致了这里的解决方案,但我不太明白这是如何工作的。该程序也可以是其他语言,但它应该触发我的 python 模块。

这是我正在寻找的一般想法。

0 投票
1 回答
124 浏览

c++ - 谁负责删除 FILE_NOTIFY_INFORMATION.FileName?

WinapiReadDirectoryChanges用于FILE_NOTIFY_INFORMATION呈现它的结果。该结构如下所示:

如果我让这个结构由 winapi 填充,我该如何正确删除FileName WCHAR*?我必须删除它吗?

没有一个例子(不是很多例子)ReadDirectoryChanges提到删除任何东西。Microsoft 当然根本没有提供任何示例。

0 投票
1 回答
131 浏览

c - ReadDirectoryChangesW 不报告上次写入事件

我已经设法开始ReadDirectoryChangesW()处理我需要监控的文件夹。我正在使用 IO Completion 例程,所有更改监视都是由一个线程完成的,该线程除了等待更改和停止信号之外什么都不做。这一切都很好。完成例程当前只是将更改的文件名和操作从通知记录记录到系统调试日志。再次,似乎工作正常。在测试时,我正在等待所有可用的事件(掩码 0x017F)。

我的问题是:为什么我从来没有看到任何 LAST WRITE 更改事件,比如记事本,保存更改的文件?

我最初只等待 FILE_NOTIFY_CHANGE_CREATION、_LAST_WRITE 和 _FILE_NAME 事件,并想知道为什么我从未看到最后写入事件(但我确实看到了 _DIR_NAME 事件,但我并没有等待),所以我改为等待所有事件。

我的代码目前与我在这里找到的示例非常相似: ReadDirectoryChangesW

在调试时,我曾经FindFirstFile()在更改被监视的文件之前和之后获取 WIN32_FIND_DATA 的副本,以验证上次写入时间是否已更改——确实如此。那为什么不通知呢?为了启用它,我需要做些什么特别的事情吗?

0 投票
1 回答
303 浏览

c++ - 为什么 GetOverlappedResult 为 ReadDirectoryChangesW 提供 0 字节结果?

我为我们的项目编写了一个文件系统观察器。突然,它停止正确获取事件。我发现,GetOverlappedResult返回 true 后,结果数据为空,返回的字节数也是空的。

这就是我创建用于观看目录的文件句柄的方式:

这就是我开始观看的方式:

在我使用WaitForMultipleObjects等待事件(不止一个)之后,这就是我尝试获取结果的方式:

但是突然间,当我将文件复制到监视目录时,事件就会触发 - 但我可以在调试器中看到它_ovlBytesReturned0只是_resultData零。

有没有我可以尝试更改的标志来解决这个问题?我很确定它曾经可以工作,我不知道会发生什么变化。

我已经尝试将 false 更改为 true GetOverlappedResult(GetDirectoryHandle(), &_ovl, &_ovlBytesReturned, FALSE),以防有额外的等待需要。它没有任何效果。

0 投票
1 回答
272 浏览

winapi - 关闭句柄后调用的 ReadDirectoryChangesW 异步完成例程

ReadDirectoryChangesW用来监视目录中文件何时更改。我正在使用带有完成例程函数的异步版本(根据文档)。

一切正常,直到我希望停止监视该文件夹。

为了停止监控,我调用了这个Close函数。

问题是我仍然收到最后一个通知,但到那时我已经破坏了我的LPOVERLAPPED价值。

如何停止ReadDirectoryChangesW并阻止MyCompletionRoutine调用我的函数。

在上面的代码中,我可能已经调用Read但我想在MyCompletionRoutine调用之前停止。

不知道这是否有帮助,但我得到的错误信息是317

0 投票
1 回答
432 浏览

c++ - ReadDirectoryChangesW 仅将单个事件放在 FILE_NOTIFY_INFORMATION 缓冲区中

我有一个问题ReadDirectoryChangesW不断丢失事件。

我做了很多谷歌搜索,根据我的搜索,下面的函数参数似乎是正确的,但没有人确切知道。我开始这样看。

完成上述操作后,我等待_ovl.hEventusing WaitForMultipleObjects. 我使用多个对象,因为我总是会告诉监视线程退出的事件。

如果ovl.hEvent收到通知,我会这样做:

在这一点上我应该注意,这info->NextEntryOffset并不总是 0 - 如果我重命名一个文件,我会正确地在 中获得两个条目_resultData,一个用于新文件名,一个用于旧文件名。

永远不会得到的是每个事件的多个文件更改。这是一个问题,整个代码看起来像这样(伪代码)

现在您可以看到我在处理数组ReadDirectoryChangesW 之前重新启动了请求。MyFileInfoStruct但问题是,如果复制了两个以上的文件,第二个文件在我处理前一个文件时被事件注册,但随后的更改被忽略,直到我“拾取”最后一个更改并重新启动事件。

我可以通过让第二个线程来处理来自 FILE_CHANGES部分的所有信息来部分解决这个问题。但这只会通过发出整个启动请求来减少错过事件的机会->等待->拾取->重新启动事件例程更快一些它实际上并没有提供 100% 的覆盖率,仍然存在没有ReadDirectoryChangesW待处理请求的时刻。

我在互联网上阅读了很多内容,发现经常提到两种解决方案:

  • 使用单独的线程来处理文件更改(我已经这样做了)
  • 增加FILE_NOTIFY_INFORMATION[]. 这对我不起作用,Windows 只在那里放置一个事件

因此问题是:我如何获得ReadDirectoryChangesWGetOverlappedResult继续在FILE_NOTIFY_INFORMATION[]缓冲区中添加文件更改,直到我通过调用“拾取”结果GetOverlappedResult?这甚至可能吗?有没有人设法将多个结果放入一个缓冲区?