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

macos - Mac OS X 中的文件级文件系统更改通知

我希望在(直接或间接)给定目录下的任何文件被修改时通知我的代码。通过“修改”,我的意思是我希望在文件内容被更改、重命名或删除时通知我的代码;或者如果添加了新文件。对于我的应用程序,可能有数千个文件。

我看起来像 FSEvents,但它的技术概述部分说:

重要的一点是通知的粒度是在目录级别。它只告诉您目录中的某些内容发生了变化,但不告诉您发生了什么变化。

它还说:

文件系统事件 API 也不是为找出特定文件何时更改而设计的。对于这样的目的,kqueues 机制更为合适。

但是,为了在给定文件上使用 kqueue,必须打开文件以获取文件描述符。管理数千个文件描述符是不切实际的(而且可能会超过允许的最大打开文件描述符数)。

奇怪的是,在 Windows 下,我可以使用该ReadDirectoryChangesW()功能,它正是我想要的。

那么如何在 Mac OS X 下做我想做的事呢?或者,换一种方式问:如何ReadDirectoryChangesW()在用户空间中为 Mac OS X 编写等价物(并且这样做非常有效)?

0 投票
2 回答
2594 浏览

samba - 任何 linux API 或工具都可以监视下面任何文件夹中的任何更改,例如 /SharedRoot 还是我必须为每个文件夹设置例如 inotify?

我有一个包含约 10 000 个子文件夹的文件夹。

任何 linux API 或工具都可以监视下面任何文件夹中的任何更改,例如 /SharedRoot 还是我必须为每个文件夹设置 inotify?(即,如果我想为 10k+ 个文件夹执行此操作,我会松动)。我想是的,因为我已经看到了这种低效方法的例子,例如http://twistedmatrix.com/trac/browser/trunk/twisted/internet/inotify.py?rev=28866#L345

我的问题:
我需要将文件夹与最近活动的“项目”按时间排序。

当文件更改时,该文件上方的每个文件夹都应更新其上次修改的时间戳以匹配该文件。延迟没问题。打开一个文件(通常是 MS Excel)并再次关闭,它的文件日期可以上下跳跃。出于这个原因,我需要等到文件关闭后,然后将该文件的文件夹排队以进行检查,然后我才去其文件夹中查找最新的文件,因为触发文件的文件日期可能已经通过 Excel 或类似程序回溯到其原始时间戳。此外,如果使用/创建了来自同一文件夹的多个文件,缓冲该文件夹父级的时间戳以至少将一堆更新折叠成一个延迟更新是有意义的。

我正在寻找一个linux解决方案。我有一些可以在 Windows 服务器上运行的代码,大部分排队功能都在这里:http: //github.com/sesam/FolderdateFollowsFiles/blob/master/FolderdateFollowsFiles/Follower.vb

可用API:s
inotify 在windows 上的亲戚ReadDirectoryChangesW,可以监视一个文件夹及其整个子树;请参阅http://msdn.microsoft.com/en-us/library/aa365465(VS.85).aspx上的 bWatchSubtree

桑巴?
修补 samba 源代码是可能的,但也许已经有可用的钩子了?其他可能性,例如客户端(各种 Windows 版本)和监视文件活动以递归更新文件夹?

0 投票
1 回答
3068 浏览

c++ - Win32 C++ ReadDirectoryChangesW“创建”和“修改”文件差异检测?

这是问题所在:我使用 Win32 API ReadDirectoryChangesW函数监视目录。而且我需要区分新创建的文件和修改过的文件。但是有问题......一如既往:(

案例:

  1. 我监视目录中的新/修改(FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE)。问题:创建文件后,触发新文件事件+修改文件事件。但我只需要一个。我怎样才能避免这种情况?当文件被修改时,我得到了我想要的:)。
  2. 我只监视新文件的目录 ( FILE_NOTIFY_CHANGE_FILE_NAME) - 没有问题。
  3. 我监视目录仅用于修改文件(FILE_NOTIFY_CHANGE_SIZE)。问题:当一个新文件存在时,修改操作与文件创建事件一起被触发。我怎样才能避免这种情况?

当然,我实施了一些解决方法。但是,我想知道是否有任何优雅的方式来处理我描述的问题。

0 投票
1 回答
1638 浏览

c - 如何处理 Windows 的 ReadDirectoryChangesW() 及其混合长/短文件名输出?

我正在开发一段 C 代码,它使用 ReadDirectoryChangesW() 来监视 Windows 目录下的更改。我已经阅读了 ReadDirectoryChangesW() 和 FILE_NOTIFY_INFORMATION 结构的相关 MSDN 条目,以及其他几篇文档。在这一点上,我已经设法监控多个目录,监控本身没有明显问题。问题是这个函数放在 FILE_NOTIFY_INFORMATION 结构中的文件名不是规范的。

根据 MSDN,它们可以是长形式或短形式。我发现了几篇建议缓存短路径名和长路径名来处理这种情况的帖子。不幸的是,根据我自己在 Windows 7 系统上的测试,这不足以消除该问题,因为每个文件名不仅有两种选择。问题是路径名中的每个组件都可以是长格式或短格式。以下路径名都可以引用同一个文件:

c:\PROGRA~1\MYPROG~1\MYDATA~1.TXT

c:\PROGRA~1\MYPROG~1\MyDataFile.txt

c:\PROGRA~1\MyProgram\MYDATA~1.TXT

c:\PROGRA~1\MyProgram\MyDataFile.txt

c:\Program Files\MYPROG~1\MYDATA~1.TXT

...

据我使用 cmd.exe 进行的测试可以看出,它们都是完全可以接受的。本质上,每个文件的有效路径名的数量随着其路径名中的组件数量呈指数增长。

不幸的是,ReadDirectoryChangesW() 似乎用提供给导致每个操作的系统调用的文件名填充其输出缓冲区。例如,如果您使用 cmd.exe 命令来创建、重命名、删除等文件,则 FILE_NOTIFY_INFORMATION 将包含在命令行中指定的文件名。

现在,在大多数情况下,我可以使用 GetLongPathName() 和朋友来获得一条独特的路径供我使用。不幸的是,删除文件时无法做到这一点——当我收到通知时,文件已经消失,Get*PathName() 函数将无法工作。

目前我正在考虑使用更广泛的缓存来确定每个文件的应用程序使用哪些替代路径名,这将处理任何情况,除了有人决定使用看不见的混合路径名突然删除文件的情况. 而且我正在考虑从父目录修改事件中进行创造性数据挖掘,并回退到检查该案例的实际目录。

关于更简单的方法的任何建议?

PS1:虽然 Change Journals 可以有效地处理这个问题(我希望),但由于它们与 NTFS 的联系以及我的应用程序缺乏管理员权限,我不相信我可以使用它们。我宁愿不去那里,除非我绝对被迫去。

PS2:请记住,我主要在 Unix 上编码,所以要温柔...

0 投票
1 回答
4100 浏览

c - 使用 ReadDirectoryChangesW API 监控目录

我正在尝试e:\test使用ReadDirectoryChangesW API 监视目录。

我的代码:

我不知道我的代码有什么问题,因为我没有完全理解 ReadDirectoryChangesW 文档,特别是LPOVERLAPPED 参数。

当我运行代码时,我没有得到任何输出,除了一个空白的控制台窗口。有人能指出我正确的方向吗?

谢谢。

0 投票
0 回答
480 浏览

windows - 如何使用 ReadDirectoryChanges api 获取移动事件?

ReadDirectoryChanges windows api 不提供文件/文件夹移动事件(尽管它适用于重命名事件)。相反,它给出了删除和添加的事件。我们如何将其与真正的删除和添加事件区分开来。

编辑: Windows中的文件夹是否有一个独特的属性,当文件夹在驱动器内移动时不会改变?

0 投票
2 回答
8264 浏览

c - 异步 ReadDirectoryChangesW - GetQueuedCompletionStatus 总是超时

就像听起来一样,我正在尝试ReadDirectoryChangesW与 IO Completion 异步,但它不起作用,特别是GetLastError反复返回 258 (GetQueuedCompletionStatus超时)。

我有结构:

用于存储相关信息。这是初始化的:

然后我创建我的目录句柄和 com 端口:

然后我通过 d 将此信息传递给一个新线程。现在在所说的新线程上,我有:

所以我把它设置为运行,我很高兴得到超时(258个错误),因为目录没有改变。但是,即使我更改了目录,我仍然会收到错误消息;换句话说,这些改动没有被采纳。这让我相信我的设置不正确。

有任何想法吗?

注意事项:

  • 具有讽刺意味的是,这最终将通过 pywin32 转换为 Python。但是,在我了解这应该如何在 C 中工作之前,我不会去那里。
  • 同步ReadDirectoryChangesW不是一个选项。如果没有事件被触发,我需要这个线程超时,以便它可以检查它是否应该仍在运行。
  • 我专门用 C 编写,而不是 C++。
  • FindFirstChangeNotification等等也不是一个选项——我不想不断地比较目录列表来找出发生了什么变化。

其他注意事项:

  • 目录存在,该句柄不为 NULL。对于 comport 句柄也是如此。
  • 一切都被传递到线程

我从代码项目中查看了CDirectoryChangeWatcher,但是除了使用 C++ 和更多线程之外,我看不出我在做什么不同。如果我遗漏了什么,请随时指出!

输出,如果有帮助的话,基本上是重复的,不管我改变了多少有问题的目录。

0 投票
1 回答
2905 浏览

delphi - Delphi 等待文件复制过程完成

我有一个线程用于ReadDirectoryChangesW在文件夹中添加或删除文件时通知我。

对于每个新图像,我打开文件并创建图像的缩略图。但是,我似乎在文件完全复制到目标文件夹之前收到了通知,在这种情况下,我只会得到部分缩略图。(文件从远程位置复制到中央服务器,网络在高峰时间会变慢。)

我确实检查了文件是否正在使用中,但这似乎不适用于图像文件。

我的问题是:有没有办法检测文件何时被完全复制,还是我只是等到文件大小或上次修改时间自上次检查以来没有改变?

0 投票
3 回答
4200 浏览

python - ReadDirectoryChangesW 阻止删除监视的目录

我正在尝试使用 ReadDirectoryChangesW API 使用 Python 在 Windows 上查看创建/删除/重命名更改的目录。这是我的代码,它工作正常:

但是,当我尝试从 python 或 Windows 资源管理器中删除监视的文件夹时,我得到:

WindowsError:[错误 32] 该进程无法访问该文件,因为它正被另一个进程使用:'c:\users\user\appdata\local\temp\new_dir'

我相信这是有道理的,但我应该如何解决这个问题?因为我的应用程序应该允许用户删除被监视的文件夹。我尝试了异步方法http://www.themacaque.com/?p=859的解决方案,但没有帮助。

提前致谢!

0 投票
3 回答
1824 浏览

c++ - 调用 ReadDirectoryChangesW 时,只有第一次调用会返回任何更改(同步和异步)

以下是一个使用ReadDirectoryChangesW. 我遇到的问题是只有第一次调用GetQueuedCompletionStatus返回。第二次通过循环,无论对目录进行多少更改,它都会永远阻塞。

我也尝试过使用同步版本并遇到完全相同的问题。