【问题标题】:detecting if two files are strictly identical, what to compare?检测两个文件是否严格相同,要比较什么?
【发布时间】:2011-02-01 14:46:53
【问题描述】:

我想知道如何比较两个文件以确定它是否完全相同。 如果需要,我知道如何比较文件名、创建/修改日期,甚至哈希。

但是我不知道如何比较文件上的元数据(我实际上不知道它是如何存储的):安全配置、兼容性设置、潜在的防病毒时间戳等等。

我的最终目标是深入比较不同计算机上的两个文件系统

谢谢 史蒂夫

[编辑]为了澄清我重新制定了问题的标题

【问题讨论】:

  • 严格相同,就像存储在同一个磁盘上的相同位置?
  • @fredley,在文件系统中的相同位置,相同的属性,相同的......一切

标签: c#-4.0 filesystems ntfs filecompare


【解决方案1】:

什么构成文件?在现代文件系统(比如 NTFS)上,你有

  • 文件属性(时间、FAT 属性)
  • 未命名的文件流
  • 零个或多个备用数据流 (ADS)
  • 扩展属性
  • NTFS 安全性(它存储在 ADS 中,但我们可以单独识别它)

其余部分(配置、防病毒时间戳/这是什么/等)存储在文件之外,而不是文件。

因此您需要检查文件的上述位并进行比较。

存在用于读取不同信息位的不同方法,您需要将它们全部使用以将它们放在一起并针对不同的文件进行比较。

【讨论】:

    【解决方案2】:

    只需遍历 System.IO.File 上的所有 getter。

    GetAccessControl
    GetAttributes
    GetCreationTime
    ...
    ReadAllBytes
    

    如果您对“同一文件”的定义还依赖于其他任何东西(例如在不同机器上的绝对路径),那么也可以得到它,但您还没有弄清楚那是什么。

    【讨论】:

    • 我正在寻找来自“Eugene Mayevski 'EldoS”的答案。
    【解决方案3】:

    您需要对两个文件进行 MD5、SHA 哈希处理,并比较两者的总和是否相同。

    检查 System.Security.Cryptography 中的 MD5CryptoServiceProvider 和 SHA512CryptoServiceProvider。

    是这样的:

    private string ComputeHashAsText(byte[] fileBytes)
    {
        using (SHA512CryptoServiceProvider cryptoService = new SHA512CryptoServiceProvider())
        {
            return Encoding.ASCII.GetString(cryptoService.ComputeHash(fileBytes));
        }
    }
    
    public bool CompareFiles(string pathA, string pathB)
    {
        string hashPathA = ComputeHashAsText(File.ReadAllBytes(pathA));
        string hashPathB = ComputeHashAsText(File.ReadAllBytes(pathB));
    
        return hashPathA == hashPathB;
    }
    

    在实际的解决方案中,您可能希望以块或类似的方式计算哈希,因为要比较的文件可能太大而无法将所有字节读取到内存并对其进行哈希处理。

    【讨论】:

    • 我的问题更多的是“比较什么”而不是“如何比较”。但是感谢您的提示
    • 我在您的问题中阅读了“如何比较”(您的问题是“我不知道如何比较[...]”)! :D 我已经回答了,因为这是确保两个文件在不同的物理网络位置相同的最佳方法。我知道您在询问元数据,但是,我再说一遍,比较两个文件,因为元数据不一定是了解两者相同的好方法(如果两个不同的流具有相同的元数据怎么办?)。
    • 我想比较内容(简单)和元数据。我的最终目标是检测完整的文件系统差异
    • @Steve B - 我明白了,可以理解。
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多