如何确定文件最近一次重命名的时间?
Posted
技术标签:
【中文标题】如何确定文件最近一次重命名的时间?【英文标题】:How can I determine when a file was most recently renamed? 【发布时间】:2011-01-19 20:48:37 【问题描述】:我有一个程序可以比较两个文件夹中的文件。我想检测文件是否已重命名,确定最新文件(最近重命名),并更新旧文件上的名称以匹配。
为此,我会检查最新文件是否与旧文件一点点相同,如果是,只需重命名旧文件以匹配新文件。
问题是,我没有什么可以告诉我最近重命名了哪个文件。
我喜欢 FileInfo.LastModified 之类的属性,但对于已重命名的文件。
我已经看过 FileSystemWatcher 之类的解决方案,但这并不是我真正想要的。我希望能够随时运行我的同步器,而不必担心跟踪文件夹状态的一些专用进程。
有什么想法吗?
【问题讨论】:
【参考方案1】:答:至少在 NTFS 上,您可以附加 alternate data streams to a file。 在您第一次同步时,您只需将 ADS 中的 GUID 附加到源文件以标记它们。
B:如果您没有对源的写入权限,请将您同步的文件的哈希值存储在目标存储库中。当源更改时,您只需对源文件进行哈希处理,并且仅在哈希冲突时逐位比较。根据散列函数的质量和速度,这将为您节省大量时间。
【讨论】:
我已经在每一端存储了目录的哈希值。逐位匹配数据已经成为可能。我只是希望通过移动预先存在的文件在慢速网络上同步时能够为自己节省一些带宽。看起来没有非 NTFS 特定的方法可以做到这一点。 这可能适用于映射驱动程序(或网络共享),前提是源卷是 NTFS。如果您还没有找到它,这可能会有所帮助:codeproject.com/KB/cs/ntfsstreams.aspx【参考方案2】:如果您在 NTFS 驱动器上运行,您可以启用 change journal,然后您可以查询诸如重命名事件之类的内容。但是,您需要成为管理员才能启用它,并且它将使用磁盘空间。不幸的是,我不知道阅读期刊的任何特定 C# 实现。
【讨论】:
【参考方案3】:您可以创建一个配置文件,其中包含文件夹中所有预期名称的列表,然后,如果文件夹中的文件不是预期名称列表的成员,则确定该文件已被重命名.但是,考虑到每次您希望将新文件添加到文件夹时都必须更改列表,这会增加另一层工作。
【讨论】:
这不适用于我的工具。这意味着在两个方向上同步任何两个目录。 您是否尝试过无可比拟的?对于您正在寻找的东西,它是一个很好的工具。【参考方案4】:文件系统通常不会跟踪这一点。
由于您似乎在 Windows 上,您可以使用GetFileInformationByHandle()。 (抱歉,我不知道 C# 的等价物。)您可以使用返回的结构中的“文件索引”字段来查看文件是否具有与您之前看到的相同的索引。请记住,硬链接也将具有相同的索引。
或者,您可以以某种方式散列文件内容。
我不确切地知道你想要做什么,所以我不能告诉你这些点是否有意义。最合理的答案可能是,“不,你不能那样做。”
【讨论】:
我很确定这不是 OP 正在寻找的东西,但它仍然是一个有趣的想法......可能比 OP 的测试计划更好,如果这两个文件有点相同确定已执行重命名。 这是个好主意,但是文件ID有很多问题。备注部分说,“存储在 nFileIndexHigh 和 nFileIndexLow 成员中的标识符称为文件 ID。[So high index & low index => file ID] 支持 file IDs 是特定于文件系统的[所以,并非所有文件系统都支持它...NTFS 可能支持,谁知道其余的是否支持?]. 文件 ID 不能保证随着时间的推移是唯一的,因为文件系统是免费的重用它们[但我猜它们会是时间的快照]。在某些情况下,文件的文件 ID 可能会随着时间而改变。”【参考方案5】:我会对(全部?)2个目录中的文件进行CRC(例如CRC example),存储最后一次更新时间以及CRC值、文件名等。之后,通过列表交互查找机器CRC,然后使用日期值来决定要做什么。
【讨论】:
我已经这样做了。问题是重命名文件不会修改任何时间戳。 哦 - 据我所知,您不能重命名文件,也不能修改它的时间戳。如果可以的话,这将是一个相当低级的 API 调用(不太可能被 C# 公开)以上是关于如何确定文件最近一次重命名的时间?的主要内容,如果未能解决你的问题,请参考以下文章