7

我有一个程序可以比较两个文件夹中的文件。我想检测文件是否已重命名,确定最新文件(最近重命名),并更新旧文件上的名称以匹配。

为此,我会检查最新文件是否与旧文件一点一点地相同,如果是,只需重命名旧文件以匹配新文件。

问题是,我没有什么可以告诉我最近重命名了哪个文件。

我喜欢 FileInfo.LastModified 之类的属性,但对于已重命名的文件。

我已经看过 FileSystemWatcher 之类的解决方案,但这并不是我真正想要的。我希望能够随时运行我的同步器,而不必担心跟踪文件夹状态的一些专用进程。

有任何想法吗?

4

5 回答 5

1

答:至少在 NTFS 上,您可以将备用数据流附加到文件。在您第一次同步时,您只需将ADS中的 GUID 附加到源文件以标记它们。

B:如果您没有对源的写入权限,请将您同步的文件的哈希存储在目标存储库中。当源更改时,您只需对源文件进行哈希处理,并且仅在哈希冲突时逐位比较。根据散列函数的质量和速度,这将为您节省大量时间。

于 2010-02-22T23:35:41.017 回答
1

如果您在 NTFS 驱动器上运行,您可以启用更改日志,然后您可以查询诸如重命名事件之类的内容。但是,您需要成为管理员才能启用它,并且它将使用磁盘空间。不幸的是,我不知道阅读期刊的任何特定 C# 实现。

于 2010-02-22T23:13:27.213 回答
0

您可以创建一个配置文件,其中包含文件夹中所有预期名称的列表,然后,如果文件夹中的文件不是预期名称列表的成员,则确定该文件已被重命名。但是,考虑到每次您希望将新文件添加到文件夹时都必须更改列表,这将增加另一层工作。

于 2010-02-22T22:47:33.467 回答
0

文件系统通常不跟踪这一点。

由于您似乎在 Windows 上,您可以使用GetFileInformationByHandle()。(抱歉,我不知道 C# 等价物。)您可以使用返回的结构中的“文件索引”字段来查看文件是否具有与您之前看到的相同的索引。请记住,硬链接也将具有相同的索引。

或者,您可以以某种方式散列文件内容。

我不确切地知道你想要做什么,所以我不能告诉你这些点是否有意义。最合理的答案可能是“不,你不能那样做”。

于 2010-02-22T23:03:35.157 回答
0

我会对(全部?)2个目录中的文件进行CRC(例如CRC示例),并使用CRC值、文件名等存储上次更新时间。之后,通过CRC查找机器的列表进行交互,然后使用日期值来决定做什么。

于 2010-02-22T23:54:10.783 回答