检测两个文件是否完全相同,要比较什么?

时间:2011-02-01 14:46:54

标签: c#-4.0 filesystems ntfs filecompare

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

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

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

感谢 史蒂夫

[编辑]为了澄清我重新阐述问题的标题

3 个答案:

答案 0 :(得分:2)

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

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

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

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

存在用于读取不同信息的不同方法,您需要使用它们将所有信息组合在一起并将它们与不同文件进行比较。

答案 1 :(得分:1)

只需使用System.IO.File上的所有getter。

GetAccessControl
GetAttributes
GetCreationTime
...
ReadAllBytes

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

答案 2 :(得分:0)

你需要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;
}

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