2

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

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

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

谢谢史蒂夫

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

4

3 回答 3

2

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

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

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

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

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

于 2011-02-01T14:56:38.390 回答
1

只需处理 System.IO.File 上的所有 getter。

GetAccessControl
GetAttributes
GetCreationTime
...
ReadAllBytes

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

于 2011-02-01T14:58:23.383 回答
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;
}

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

于 2011-02-01T14:52:07.463 回答