在Windows上有类似inotify的东西吗?


103

在Linux OS中,有ionotify子系统可以通知应用程序对文件系统的更改。

但是,我主要是Windows用户,所以我想知道是否存在监视文件系统更改的类似方法?


9
我认为这样的问题不成问题。这个问题要求一个OS API,它与任何工具/软件库都大不相同。可能是措词不同,例如修改特定文件后如何在Windows应用程序中获得通知。
巴尔基

1
投票重新开放:问题是要寻求特定操作系统API的替代方案,并比喻我:“我来自英国,我用叉子吃食物,在日本,我用类似的方式使用什么用具? ” 使用类推的公认答案是“使用筷子”。
大卫,

Answers:



42

如果您使用的是.net,请使用FileSystemWatcher。此处的更多信息:http : //msdn.microsoft.com/zh-cn/library/system.io.filesystemwatcher.aspx

如果您使用Ç,使用FindFirstChangeNotificationFindNextChangeNotificationReadDirectoryChangesW。此处的更多信息:http : //msdn.microsoft.com/zh-cn/library/aa365261(VS.85).aspx

OSX上,相关的api是fseventsapi。

它们彼此之间都存在细微的差异,并且在极端情况下都具有可疑的可靠性。通常,您不可能100%地依靠这些api来完整查看所有更改。大多数使用文件系统监视的人都将它与定期扫描结合起来,以补偿来自推送api的丢失或不完整的信息。


6
能否请您引用“在有优势的情况下进行
化验的

18
如果fs watcher api的使用者读取事件的速度比其他进程生成事件的速度慢,则内核要么需要在另一个(可能是更高优先级)进程中阻止文件系统修改,要么允许缓冲区的无限增长。inotify的缓冲区深度(如手册页中所述)由/ proc / sys / fs / inotify / max_queued_events控制。除此之外,您还会收到IN_Q_OVERFLOW通知-这很好,但是您仍然处于可能需要不时重新扫描的情况。
blucz 2010年

啊哈,对了,我最近正在排队。我认为这种情况取决于您监视的文件数量,还取决于跟踪所有更改的关键性或是否会遗漏一些。但这是一个好点。谢谢:)
法老(Pharaun)2010年

@blucz我想知道核心人员如何解决这些情况。很高兴知道他们这样做,使人们对设计和实施更有信心。
n611x007 2013年


11

来自Microsoft的JNotifyFileMon


8
JNotify对我来说是完美的,因为我需要跨平台兼容性。假设仅正确设置了JAVA_HOME,我什至可以编写一个可以在cygwin,mac和linux中使用的bash脚本。当客户的计算机上说“它删除了我的文件!”时,这对于调试问题非常有用。我实际上可以查看日志,并尝试弄清发生的时间。
cmyers

1
FileMon现在是ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU

10

有点晚但是...

Windows具有类似于OSX事件的功能,您可以在不运行应用程序的情况下监视事件。Windows USN Journal会跟踪所有文件更改。Jeffrey Richter(Advanced Windows的作者)写了一篇很棒的文章,其中包含有关MSDN Journal的工作示例。更新文章从archive.org现在因为MSJ不再在网上MS。

USN更改日记的MSDN文档。

如果您要构建需要监视整个卷的应用程序(例如备份工具或索引),则USN更改日志可能会更好。


USN Journal的方式是否有所不同,是否依靠它来避免FileSystemWatcher| 的错误行为?FindFirstChangeNotification PhillipBrandonHolmes什么?
n611x007

4
自从我从事此工作已经有一段时间了,但是它不使用FileSystemWatcher或FindFirstChangeNotification。我开始大量基于Jeffery Richter的示例在Go中编写Windows事件观察器。根据我所做的测试,它坚如磐石,并且没有遗漏任何东西,类似于OS X中的fsevents。Gist在这里:gist.github.com/pkrnjevic/7219861
Peter Krnjevic 2013年

@PeterKrnjevic您可以更新Jeffrey Richter的文章链接吗?
SOUser

@SOUser,由于MS bitrot,现在已从archive.org链接了该文章。
Peter Krnjevic

3

FileSystemWatcher()之所以不可靠,主要是因为对watcher缓冲区的错误处理或多或少是不完整的。由于缺少路径和详细的错误处理信息,Microsoft无法为您提供恢复或手动轮询工作目录的方法。

Windows的JNotify也不可靠,因为此bug ^源自win32。JNotify使用win32。因此,它与FileSystemWatcher()没有什么不同。


考虑如何设计角色来解决类似“速度” /“竞赛” /“溢出”的问题时,我想知道内核是如何做到的。有趣。网络和日志记录也会发生这种情况。这个问题有名字吗?
n611x007 2013年

是的,它的名字是“ bug”。迄今为止,该错误(win32)遗留在Microsoft创建的每个操作系统中。这使得任何Microsoft操作系统都不适合文件监视类型的解决方案。你必须去* nix来完成它。有时我认为出于安全原因,他们有意让此缓冲区溢出。
菲利普·布兰登·霍尔姆斯

哈哈..是的..它的名称是有意群集冲突,因此无法有意监视Microsoft的文件系统。由于安全问题,这是他们留下的错误。
菲利普·布兰登·霍尔姆斯

1

我做了一些搜索,似乎还记得有类似的Windows版本。有用于.NET 的 FileSystemWatcher。其主要用于NT或XP及更高版本。


通常,它仅在NTFS文件系统上可用,而在FAT16,FAT32甚至新的exFAT上不可用。
Mastacheata '18 / 11/11

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.