如何捕获文件复制/移动事件的详细信息,例如源文件名

时间:2013-03-21 14:43:52

标签: .net windows events filesystems filesystemwatcher

只想编写一个应用程序来跟踪磁盘中文件之间的关系。

我们知道FileSystemWatcher可以在创建,重命名或删除文件时触发evetns。

但FileSystemWatcher无法告诉我们源文件的路径。

例如,假设F1中有一个文件folder1,然后我们将F1复制到另一个名为folder2的文件夹,新文件名仍然是F1。在这种情况下,FileSystemWatcher可以告诉我们在folder2中创建了一个新文件。但它无法告诉我们新的F1是从F1中的folder1复制的,而这些信息就是我们所需要的。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这是因为就文件系统而言,没有“复制文件”这样的操作。

当您运行文件复制命令时,它实际打开旧文件,创建新文件,将内容读入内存,写入新文件,然后关闭两者。所有文件系统都看到了写入;没有用于确定数据实际来自另一个文件而没有修改的污点跟踪系统。

将文件副本与正常写入文件区分开来的最后一步是更改目标的元数据以匹配源。但同样,文件系统不知道你为什么要更改属性或者你正在匹配它们的文件。

文件系统只具有链接和取消链接的特殊意识。所以移动,包括“创建内容的第二个链接;删除第一个链接”是可检测的。如果复制实现为“创建标记为copy-on-write的新链接”,那么您可以发现它,但是copy-on-write不是一个非常流行的文件系统功能。

答案 1 :(得分:0)

事情是:你不会为文件夹“f1”触发复制事件。

触发文件监视文件夹1的是:更新文件,将文件从其他目录复制到“f1”或删除文件。

您可以尝试使用“f1”中的两个文件..同时将文件复制到“f2”,您可以更新第二个文件,从而触发更新事件处理程序..........

希望这会有所帮助......