我正在寻找一种在Windows XP +中扫描目录结构以查找已更改文件的高效方法。 像git这样做正是我正在寻找的,当运行一个git status
它显示所有修改的文件,所有新(未跟踪)的文件和删除文件很快,这正是我想要做的。
我有一个基本的模型启动和运行,执行初始扫描,并存储所有的文件名,大小,date和属性。
在随后的扫描中,它会检查大小,属性或date是否已更改并标记为已更改的文件。
我的问题现在来检测移动和删除的文件。 有没有一个经过validation的testing方法? 我正在努力想出一个好方法。
我应该提到,它最终将使用ReadDirectoryChangesW
来监视文件,并在出现更改时提醒用户,因此完全扫描在初始扫描之后确实是最后的手段。
谢谢,J
编辑:我想我可能已经很糟糕地描述了这个问题。 我面临的问题并不是检测到更改 – 我有ReadDirectoryChangesW()
使用IOCP在多个线程上检测到发生更改时,问题更多的是如何处理这些信息。 例如,一个移动的文件被报告为一个删除,然后是一个创build,一个重命名包括两部分,旧名称,后面是新名称。 所以我问的是如何区分作为移动的一部分和实际删除的删除。 我猜测缓冲的变化和处理批次将是一个select,但感觉凌乱。
在本机代码中, FileSystemWatcher
被ReadDirectoryChangesW替代。 正确使用这一点并不简单,在这里建立一个良好的基线。
我在以前的工作中使用过这个代码,它工作得很好。 Win32 API本身(和FileSystemWatcher
)很容易出现文档中描述的问题,也在网上的各个地方讨论过,但这些问题的影响将取决于您的使用情况。
编辑:确切的变化是在FILE_NOTIFY_INFORMATION结构中显示,你回来 – 增加,删除,重命名数据,包括旧名和新名。
我投Liviu M.了。 然而,如果你不想使用.NET框架,另一个选择是使用基本的Win32 API调用FindFirstChangeNotification 。
你可以使用USN日记,如果你是它,这是相当低的水平(NTFS级别)的东西。
在这里你可以找到详细的信息和源代码包括在内。 它是用C#编写的,但大部分是PInvoking C / C ++函数。