我正在寻找一种有效的方法来扫描Windows XP +中已更改文件的目录结构。像git这样的东西正是我正在寻找的东西,当运行git status
时,它会很快显示所有修改过的文件,所有新的(未跟踪的)文件和删除的文件,这正是我想要做的。
我有一个基本模型启动并运行,它执行初始扫描并存储所有文件名,大小,日期和属性。
在后续扫描中,它会检查尺寸,属性或日期是否已更改,并标记为已更改的文件。
现在我的问题在于检测移动和删除的文件。对于这种事情,是否有经过试验和测试的方法?我正在努力想出一个好方法。
我应该提一下,它最终会使用ReadDirectoryChangesW
监控文件,并在发生变化时提醒用户,因此在初始扫描后,完整扫描确实是最后的手段。
谢谢, Ĵ
编辑:我想我可能已经严重地描述了这个问题。我面临的问题并不是检测到这些变化 - 我有ReadDirectoryChangesW()
在多个线程上使用IOCP来检测何时发生更改,问题更多的是如何处理这些信息。例如,移动的文件报告为删除后跟创建,重命名分为2部分,旧名称,后跟新名称。所以我要问的是如何区分删除作为移动的一部分和实际的删除。我猜测缓冲更改和处理批次将是一个选项,但感觉很乱。
答案 0 :(得分:3)
在原生代码中,FileSystemWatcher
被ReadDirectoryChangesW取代。正确使用这个并不简单,有一个很好的基线来构建here。
我在以前的工作中使用过这段代码而且效果很好。 Win32 API本身(以及FileSystemWatcher
)容易出现文档中描述的问题,也会在网上的各个地方进行讨论,但这些问题的影响将取决于您的使用案例。
编辑:您获得的FILE_NOTIFY_INFORMATION结构中会显示确切的更改 - 添加,删除,重命名数据,包括旧名称和新名称。
答案 1 :(得分:2)
我投了Liviu M.但是,如果您出于某种原因不想使用.NET框架,另一个选择是使用基本的Win32 API调用FindFirstChangeNotification。
答案 2 :(得分:1)
如果您愿意,可以使用USN日记功能,这是非常低级别(NTFS级别)的东西。
Here您可以找到详细信息和源代码。它是用C#编写的,但大多数都是PInvoking C / C ++函数。