2011-02-01 107 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 

如果有別的什麼事,你的「同一文件」的定義取決於(如絕對路徑,如果在不同的機器),然後拿到爲好,但你沒有明確指出是什麼。

相關問題