问题 有人在C ++ / WinAPI中有类似FileSystemWatcher的类吗?


我需要原始C ++ / WinAPI中的.Net的FileSystemWatcher模拟。 我几乎开始使用FindFirstChangeNotification / FindNextChangeNotification自己编写代码,但后来我发现我可能不是第一个需要这个并且可能有人愿意分享的人。

理想情况下我需要的是一个可以按如下方式使用的类:

FileWatcher fw;
fw.startWatching("C:\MYDIR", "filename.dat", 
     FileWatcher::SIZE | FileWatcher::LAST_WRITE,
     &myChangeHandler);
...
fw.stopWatching();

或者,如果它会使用像boost :: signal这样的东西,那就更好了。 但是请不要使用标准库,提升和原始WinAPI之外的依赖项。 谢谢!


10143
2018-01-21 06:13


起源

是否 这个 链接帮助? - Abhay
很好!但是不支持观看特定文件,并且需要一个窗口来接收通知。但仍可以作为自己实施的蓝图。 - Alex Jenter
URL relisoft.com/win32/watcher.html 死了 - ifelsemonkey


答案:


ReadDirectoryChangesW函数怎么样?

http://msdn.microsoft.com/en-us/library/aa365465(VS.85).aspx

它将通知存储在缓冲区中,因此您不会错过任何更改(除非缓冲区溢出)


6
2018-01-21 22:05



它似乎强加了定期轮询策略,但我希望得到更改的通知(我需要在更改时重新加载文件)。 - Alex Jenter
对不起我错了。它允许等待一个事件。似乎是一个可行的选择。 - Alex Jenter
这会继续吗? WindowsCE ? - ifelsemonkey


有一些公共域代码 这里。我当前的项目使用了这个(继承自以前的开发人员)。它工作得很好,但我们确实错过了通知,原因不明(可能不是由此代码引起)。

请注意,Win32 API在这里有一些限制,这使得很难/不可能避免丢失通知。 API的背景和涉嫌工作轮次是 这里


4
2018-01-21 19:56



谢谢,似乎是一段非常好的代码!确实非常非常接近。不幸的是取决于MFC(CString,CSingleLock,CCriticalSection)因此不能按原样使用并需要重写。 - Alex Jenter
是的,实际上我们对此代码的使用不依赖于MFC。但是,这里的难点部分是来自Win32 API的信号管理,这看起来效果很好。 - Steve Townsend
仍然需要太多的重写来摆脱MFC。我可能错了,但我觉得仔细包装ReadDirectoryChangesW本身会更快更容易。 - Alex Jenter
对于打印机事件等事情,也可以看到通知API的奇怪行为: stackoverflow.com/a/16301060/2055163  stackoverflow.com/questions/18595173/... - Thorsten Schöning


这是一个跨平台的解决方案,但是很好地完成了包装Win32的工作: https://code.google.com/p/simplefilewatcher/


2
2017-09-17 08:47





http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.created%28v=vs.71%29.aspx 上面做了throgh C#,我们总能编写一个COM Wrapper


1
2017-12-30 06:52