我有一个比较两个文件夹中文件的程序。我想检测文件是否已重命名,确定最新文件(最近重命名),并更新旧文件上的名称以匹配。
为了做到这一点,我会检查最新文件是否与旧文件一点一点,如果是,只需重命名旧文件以匹配新文件。
问题是,我没有什么可以告诉我哪个文件最近被重命名。
我希望像FileInfo.LastModified这样的属性,但是对于已重命名的文件。
我已经看过像FileSystemWatcher这样的解决方案了,这不是我想要的。我希望能够随时运行我的同步器,而不必担心跟踪文件夹状态的一些专用进程。
有什么想法吗?
答案 0 :(得分:1)
如果您在NTFS驱动器上运行,则可以启用change journal,然后可以查询重命名事件等内容。但是,您需要成为管理员才能启用它,它将使用磁盘空间。不幸的是,我不知道任何特定的C#实现阅读期刊。
答案 1 :(得分:1)
答:至少在NTFS上,您可以附加 alternate data streams to a file 。 在首次同步时,您只需将 ADS 中的GUID附加到源文件即可标记它们。
B:如果您没有对源的写入权限,请存储您在目标存储库中同步的文件的哈希值。当源更改时,您只需对源文件进行哈希处理,并且只有在哈希冲突时才逐位进行比较。根据哈希函数的质量和速度,这将为您节省大量时间。
答案 2 :(得分:0)
您可以创建一个配置文件,其中包含该文件夹中所有预期名称的列表,然后,如果该文件夹中的文件不是预期的名称列表的成员,则确定该文件已被重命名。但是,考虑到每次要将新文件添加到文件夹时都必须更改列表,这将增加另一层工作。
答案 3 :(得分:0)
文件系统通常不会跟踪此内容。
由于您似乎在Windows上,因此可以使用GetFileInformationByHandle()。 (抱歉,我不知道C#等价物。)您可以使用返回的结构中的“文件索引”字段来查看文件是否与您之前看到的文件具有相同的索引。请记住,硬链接也会有相同的索引。
或者你可以以某种方式散列文件内容。
我不确切地知道你要做什么,所以我不能告诉你这些要点中的任何一个是否有意义。可能最合理的答案是,“不,你不能这样做。”
答案 4 :(得分:0)
我会使用CRC值,文件名等对存储上次更新时间的2个目录中的(全部?)文件进行CRC(例如CRC example)。之后,通过列表查找匹配进行交互通过CRC,然后使用日期值来决定做什么。