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

.net - 如何防止 ReadDirectoryChangesW 丢失文件更改

互联网上有很多关于 ReadDirectoryChangesW API 函数在文件活动很多时丢失文件的帖子。大多数都归咎于调用 ReadDirectoryChangesW 函数循环的速度。这是一个不正确的假设。我见过的最好的解释是在下面的帖子中,2008 年 4 月 14 日星期一下午 2:15:27 的评论

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4465cafb-f4ed-434f-89d8-c85ced6ffaa8/

总结是 ReadDirectoryChangesW 函数在文件更改离开文件后写队列时报告文件更改,而不是在添加时报告。如果在提交之前添加了太多,你会忽略其中一些。如果您只是编写一个程序以真正快速地在目录中生成 1000 多个文件,您可以在您的实现中看到这一点。只需计算您收到多少文件事件通知,您就会发现有时您不会收到所有通知。

问题是,有没有人找到一种可靠的方法来使用 ReadDirectoryChangesW 函数而不必每次都刷新音量?如果用户不是管理员,则不允许这样做,并且还可能需要一些时间才能完成。

0 投票
1 回答
1519 浏览

c++ - 我可以使用 FindFirstChangeNotification 和 FindNextChangeNofication 而不是 ReadDirectoryChangesW 获取指定目录中的文件信息更改吗?

当指定目录的文件或子目录发生任何更改时,我希望收到通知。我用以下简单的代码段实现了这个功能:

如何在不使用的情况下获取操作类型或文件名等信息ReadDirectoryChangesW

0 投票
1 回答
11860 浏览

windows - 如何使用带有完成例程的 ReadDirectoryChangesW() 方法?

我想ReadDirectoryChangesW()在提供 I/O 完成例程的异步模式下使用函数。

问题是我不知道如何检索有关完成例程(CALLBACK函数)中更改的确切信息。完成例程定义如下:

我想知道信息是否包含在LPOVERLAPPED结构中。但我不知道如何得到它。

0 投票
1 回答
1306 浏览

c++ - 异步使用 ReadDirectoryChangesW 时的线程死锁

我想在一个线程中实时监控多个目录的变化,所以我决定将 ReadDirectoryChangesW() 方法与 GetQueuedCompletionStatus 异步使用。这是我的代码:

在这里,当我运行我的代码时,我的线程会无缘无故地阻塞,无论我为 GetQueuedCompletionStatus() 函数的最后一个参数设置什么值。我不知道为什么我遇到了这个问题。谁能告诉我原因?非常感谢!

0 投票
1 回答
2022 浏览

c++ - 为什么我的 ReadDirectoryChangesW 没有拾取更改的文件?

我确定我只是在做一些非常愚蠢的事情而没有看到它,但是谁能告诉我为什么下面的代码不会在传入的目录中获取更改?

调用此代码时,忽略在传入的 m_directory 中创建和修改文件或目录。但如果我打电话

然后 GetQueuedCompletionStatus 正确退出。有谁看到我做错了什么?这是代码:

编辑:
好的,我认为 ReadDirectoryChangesW() 肯定会返回 TRUE,但事实并非如此。GetLastError() 告诉我错误是 ERROR_INVALID_HANDLE (6)。奇怪的是,logDirHandle 似乎是有效的,并且在调用 CreateFile() 时没有发生错误。

此外,我稍微重构以调用同步 ReadDirectoryChangesW 保持一切相同,除了丢失 OVERLAPPED 的东西,它工作正常。所以我猜我错误地实现了 OVERLAPPED 的东西?

0 投票
3 回答
2986 浏览

winapi - 如何知道文件已完成复制

我正在使用 ReadDirectoryChangesW 来监视一个文件夹,如果我将一个大文件复制到该文件夹​​,我可以收到多个 FILE_ACTION_MODIFIED 消息,似乎每次 Windows 写入一大块文件时,你都会收到每个文件的修改通知时间。我尝试使用 CreateFile API 来检查文件是否可以被 AP 打开,但有时,某些文件总是被其他 AP 锁定,例如,如果您正在打开 Outlook,PST 会更新,但我的 AP 可以'不要访问它,我们必须启动 Shadow Copy 才能打开它。所以我的问题是,如何知道文件已完成复制?

0 投票
2 回答
9194 浏览

windows - 为什么 ReadDirectoryChangesW 忽略事件?

我使用 ReadDirectoryChangesW 来监视指定的目录并在检测到更改时更新索引结构。我使用以下代码(大致)

过滤器是

并且目录句柄是这样获得的:

当我删除多个文件时,我只收到一个事件,NextOffset 为 0!当我删除一个目录时,我只得到该目录的一个事件。如果我希望目录中的每个文件都有一个事件怎么办?

任何帮助,将不胜感激。

0 投票
3 回答
1948 浏览

windows - 为什么异步使用 ReadDirectoryChangesW?

我已经阅读了该项目的文档ReadDirectoryChangesW()并查看了该CDirectoryChangeWatcher项目,但都没有说明为什么要异步调用它。我知道当前线程不会阻塞,但是,至少对于使用完成端口的 CDirectoryChangeWatcher 代码,当它调用时 GetQueuedCompletionStatus()线程无论如何都会阻塞(如果没有更改)。

因此,如果我ReadDirectoryChangesW()首先在一个单独的线程中同步调用,而我不在乎它是否阻塞,我为什么要ReadDirectoryChangesW()异步调用呢?

0 投票
3 回答
384 浏览

c++ - ReadDirectoryChangesW 认为快捷方式在创建后立即被删除

我正在使用ReadDirectoryChangesW 的这个实现来监视对桌面的更改。我的程序计划在桌面上创建文件时运行一些小程序。

现在我遇到的问题是,当我通过右键单击上下文菜单创建新的快捷方式时,ReadDirectoryChangesW 收到一条通知说文件已创建,但在它收到另一个通知说文件已被删除之后。自 Windows Vista 以来,我一直遇到这个问题。

有人知道可能出了什么问题吗?我应该使用其他功能来监视特定于 Vista 和 7 的目录更改吗?

谢谢,克里希纳

0 投票
1 回答
1206 浏览

java - 设置为 ReadDirectoryChangesW 打开的目录的最后修改时间

我有一个 Java 程序,它需要监视目录树的变化。我有使用ReadDirectoryChangesW(). 目录打开方式如下:

然后我dirHandle传给ReadDirectoryChangesW(). 所有这些都很好。

问题是代码的其他部分(在 Java 端)用于File.setLastModified()“触摸”文件或目录(将它们的时间戳更新为“现在”)。这通常有效;但是,当它尝试“触摸”使用CreateFile().

为了查看实际发生的 Windows 错误,我查看了 JDK 源代码,File.setLastModified()并在我自己的代码中重新实现了它,并添加了从GetLastError();打印错误。错误是:

怎么回事?这是相同的过程。我什至通过FILE_SHARE_READFILE_SHARE_WRITECreateFile()

有没有办法使这项工作?

更多信息

File.setLastModified()JDK 中的本机代码实现执行以下操作:

如果我将第一个更改0FILE_SHARE_READ | FILE_SHARE_WRITE,则一切正常。所以看起来JDK实现有点坏了。:(

所以我现在的问题变成了:有没有办法让这项工作而不必使用我自己的(重新)实现File.setLastModified()