2011-02-01 108 views
2

我想知道如何比较两个文件,以确定它是否完全相同。 我知道如何比较文件名,创建/修改日期,甚至如果需要散列。检测两个文件是否严格相同,要比较什么?

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

我的最终目标是要深,以便在不同的计算机

谢谢比较两个文件系统 史蒂夫

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

+0

*严格*完全相同,如同存储在同一磁盘上的相同位置? – fredley 2011-02-01 14:48:19

+0

哪个文件系统? – OrangeDog 2011-02-01 14:50:05

+0

@fredley,文件系统中的相同位置,相同的属性,相同...一切 – 2011-02-01 14:53:05

回答

2

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

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

其余(配置,防病毒时间戳/这是什么/ etc)是stor编辑在文件之外,而不是文件。

所以你需要检查文件的上述位并比较它们。

不同的方法存在读取不同位的信息,你需要全部使用它们将所有的信息放在一起并比较它们的不同文件。

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; 
} 

在实际的解决方案,您可能要计算在块或像这样的哈希,因为也许要比较的文件太大而无法读取内存和哈希的所有字节他们。

1

只需通过System.IO.File上的所有getter即可。

GetAccessControl 
GetAttributes 
GetCreationTime 
... 
ReadAllBytes 

如果有别的什么事,你的“同一文件”的定义取决于(如绝对路径,如果在不同的机器),然后拿到为好,但你没有明确指出是什么。

相关问题