【问题标题】:API to receive notifications for *all* file modifications on an entire Windows filesystem? [closed]用于接收整个 Windows 文件系统上*所有*文件修改通知的 API? [关闭]
【发布时间】:2016-07-27 14:55:46
【问题描述】:

我搜索了 StackOverflow 和其他地方,但没有找到任何适合我需要的东西。

我不想要轮询解决方案,它需要事件驱动并(近)实时接收每个此类事件。我需要的事件对象的唯一数据是修改(或创建或删除)文件的路径/名称。

请注意,我不想接收特定文件或目录的事件,我想接​​收整个卷的事件(例如“C:”​​ - 不需要支持网络驱动器!)。

理想情况下,我正在寻找一个 Java API,但我怀疑不存在,所以我很乐意为 C/C++ 编写包装器。

注意,如果仅通过 Windows 命令提示符或 WMI 也能做到这一点,那就太好了!

【问题讨论】:

  • OT 就这样。顺便看看this interesting article
  • @LPs 不幸的是,那是 linux-only。
  • @Shark 所以this one 可以提供帮助..
  • @LPs 确实,看起来你揭穿了 OPs “我到处搜索”的声明:D
  • 为什么被否决? Shark 的第二个“解决方案”(我已经找到)是 C#,不是一个可行的解决方案,因为正如明确指出的那样,我需要能够与 Java 进行互操作。

标签: java c++ windows winapi filesystems


【解决方案1】:

您需要使用FindFirstChangeNotification。指定卷的根目录,并指定您也希望收到有关子目录更改的通知。然后等待通知句柄,并使用ReadDirectoryChanges 读取更改。

请参阅 Microsoft 的此示例:

Obtaining Directory Change Notifications

(请注意,我发现搜索“Windows 文件观察器”需要 10 秒 - 如果您想要非 C 或 C++ 解决方案,您可能会发现那里的其他一些链接很有帮助。)

【讨论】:

  • 嗯,我试过“listener”、“observer”和“monitor”,而不是watcher!
  • 该 API 方法实际上并不监视文件更改,只是监视目录。要实际确定哪个文件已更改,我需要维护内存中每个文件的最后修改时间戳的映射,并将目录时间戳中的每个文件与内存中的文件进行比较,除非我错过了什么?不太实用,我担心:(
  • @barneypitt:你错过了FindFirstChangeNotification() 文档中的这个声明(上面马丁的回答也说):“这个函数并不表示满足等待条件的更改。要在通知中检索有关特定更改的信息,请使用ReadDirectoryChangesW 函数“该函数确实为您提供了添加/删除/重命名/修改文件的实际文件名。
【解决方案2】:

调用SHChangeNotifyRegister,最后一个参数设置为NULL。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2020-11-18
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多