2010-03-10 72 views

回答

2

您可以在這兩個文件上使用MD5哈希,並以這種方式進行比較。然而,它在技術上讀取整個文件。如果沒有檢查我不認爲,你將無法100%確定。

在C#中一個會以下列方式(對不起,你沒有提到特定語言)這樣做:

protected string GetMD5HashFromFile(string fileName) 
{ 
    byte[] retVal = { }; 

    using (FileStream file = new FileStream(fileName, FileMode.Open)) 
    using (MD5 md5 = new MD5CryptoServiceProvider()) 
    { 
     retVal = md5.ComputeHash(file); 
    } 

    if (retVal.Length > 0) 
    { 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < retVal.Length; i++) 
     { 
      sb.Append(retVal[i].ToString("x2")); 
     } 

     return sb.ToString(); 
    } 
    else 
    { 
     return string.Empty; 
    } 
} 

bool CompareFiles(string fileName1, string fileName2) 
{ 
    return (GetMD5HashFromFile(fileName1) == GetMD5HashFromFile(fileName2)); 
} 
+0

謝謝凱爾,我會試一試 – SharpAffair 2010-03-10 19:18:00

+0

它不'技術上'讀整個文件,它*讀取整個文件*! – bmargulies 2010-03-10 19:21:36

+0

當然,這是「技術上」說的含義。 – 2010-03-10 19:25:59

1

你可以寫,讀取文件的位自定義CRC程序。例如每1k有16個字節或類似的東西,而不是對整個文件進行CRC校驗。當然,這樣做風險更大,因爲數據可能會改變,而不會影響您比較的區塊。但CRC也有點風險,因爲兩個完全不同的數據集可能會返回相同的值。

0

恐怕你無法避免完整地讀取這兩個文件,以確保它們是平等的。

您可以先檢查兩個文件的大小;如果它們不同,則文件是不同的(但是關於文本文件只會在行分隔符上有所不同)。

如果大小相同,我沒有看到任何正確的方法去更進一步,但開始閱讀這兩個文件。當然,只要緩衝區不同,它可以立即停止,但它只能說明文件是,確實等於當最後一個字符被處理時。

1

沒有算法可以100%確定文件是相同的,除非你讀每個字節。證明很簡單 - 假設存在這種算法,我們用它來比較兩個文件。這意味着一些字節不被算法讀取。我可以通過在一個文件中更改這些字節而導致算法失敗。

1

在數學上不可能確定兩個相同大小的文件完全相同而沒有完全讀取它們,但是很可能確定它們不是而是不等於而沒有完全讀取。這可以通過各種方式完成,例如使用散列函數或短路比較。