扫描已更改的文件

时间:2010-11-03 12:50:18

标签: c++ windows git backup

我正在寻找一种有效的方法来扫描Windows XP +中已更改文件的目录结构。像git这样的东西正是我正在寻找的东西,当运行git status时,它会很快显示所有修改过的文件,所有新的(未跟踪的)文件和删除的文件,这正是我想要做的。

我有一个基本模型启动并运行,它执行初始扫描并存储所有文件名,大小,日期和属性。

在后续扫描中,它会检查尺寸,属性或日期是否已更改,并标记为已更改的文件。

现在我的问题在于检测移动和删除的文件。对于这种事情,是否有经过试验和测试的方法?我正在努力想出一个好方法。

我应该提一下,它最终会使用ReadDirectoryChangesW监控文件,并在发生变化时提醒用户,因此在初始扫描后,完整扫描确实是最后的手段。

谢谢, Ĵ

编辑:我想我可能已经严重地描述了这个问题。我面临的问题并不是检测到这些变化 - 我有ReadDirectoryChangesW()在多个线程上使用IOCP来检测何时发生更改,问题更多的是如何处理这些信息。例如,移动的文件报告为删除后跟创建,重命名分为2部分,旧名称,后跟新名称。所以我要问的是如何区分删除作为移动的一部分和实际的删除。我猜测缓冲更改和处理批次将是一个选项,但感觉很乱。

3 个答案:

答案 0 :(得分:3)

在原生代码中,FileSystemWatcherReadDirectoryChangesW取代。正确使用这个并不简单,有一个很好的基线来构建here

我在以前的工作中使用过这段代码而且效果很好。 Win32 API本身(以及FileSystemWatcher)容易出现文档中描述的问题,也会在网上的各个地方进行讨论,但这些问题的影响将取决于您的使用案例。

编辑:您获得的FILE_NOTIFY_INFORMATION结构中会显示确切的更改 - 添加,删除,重命名数据,包括旧名称和新名称。

答案 1 :(得分:2)

我投了Liviu M.但是,如果您出于某种原因不想使用.NET框架,另一个选择是使用基本的Win32 API调用FindFirstChangeNotification

答案 2 :(得分:1)

如果您愿意,可以使用USN日记功能,这是非常低级别(NTFS级别)的东西。

Here您可以找到详细信息和源代码。它是用C#编写的,但大多数都是PInvoking C / C ++函数。