1. 程式人生 > >C#判斷兩個檔案是否一樣

C#判斷兩個檔案是否一樣

1、使用System.security.Cryptography.HashAlgorithm類為每個檔案生成一個雜湊碼,然後比較兩個雜湊碼是否一致。    

2、 在比較檔案內容的時候可以採用好幾種方法。例如,檢查檔案的某一特定部分是否一致;如果願意,你甚至可以逐位元組讀取檔案,逐位元組進行比較。這兩種方法都是可以的,但在某些情況下,還是使用雜湊碼演算法更為方便。

 

雜湊演算法將任意長度的二進位制值對映為固定長度的較小二進位制值,這個小的二進位制值稱為雜湊值。

該演算法為一個檔案生成一個小的(通常約為20位元組)二進位制“指紋”(binary fingerprint)。從統計學角度看,不同的檔案不可能生成相同的雜湊碼。事實上,即使是一個很小的改動(比如,修改了原始檔中的一個bit),也會有50%的機率來改變雜湊碼中的每一個bit。因此,雜湊碼常常用於資料安全方面。要生成一個雜湊碼,你必須首先建立一個HashAlgorithm物件,而這通常是呼叫HashAlgorithm.Create方法來完成的;然後呼叫HashAlgorithm.ComputeHash方法,它會返回一個儲存雜湊碼的位元組陣列。

 

如何獲取檔案的基本資訊:

 可以使用FileInfo類的相關屬性
FileInfo.Exists:獲取指定檔案是否存在;
FileInfo.Name,FileInfo.Extensioin:獲取檔案的名稱和副檔名;
FileInfo.FullName:獲取檔案的全限定名稱(完整路徑); 
FileInfo.Directory:獲取檔案所在目錄,返回型別為DirectoryInfo; 
FileInfo.DirectoryName:獲取檔案所在目錄的路徑(完整路徑);
FileInfo.Length:獲取檔案的大小(位元組數)
FileInfo.IsReadOnly:獲取檔案是否只讀;
FileInfo.Attributes:獲取或設定指定檔案的屬性,返回型別為FileAttributes列舉,可以是多個值的組合;
FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分別用於獲取檔案的建立時間、訪問時間、修改時間;  

 

利用雜湊值判斷兩個檔案內容是否相同  程式碼如下:

只需要建立一個控制檯應用程式即可。

此方法已經測試 可用

  public static void CompareFile()
        {
            string p_1 = @"C:\Users\Administrator\Desktop\a\a.docx";
            string p_2 = @"C:\Users\Administrator\Desktop\a\b.docx";

            //計算第一個檔案的雜湊值
            var hash = System.Security.Cryptography.HashAlgorithm.Create();
            var stream_1 = new System.IO.FileStream(p_1, System.IO.FileMode.Open);
            byte[] hashByte_1 = hash.ComputeHash(stream_1);
            stream_1.Close();
            //計算第二個檔案的雜湊值
            var stream_2 = new System.IO.FileStream(p_2, System.IO.FileMode.Open);
            byte[] hashByte_2 = hash.ComputeHash(stream_2);
            stream_2.Close();

            //比較兩個雜湊值
            if (BitConverter.ToString(hashByte_1) == BitConverter.ToString(hashByte_2))
            {
                MessageBox.Show("兩個檔案相等");
            }
            else
            {
                MessageBox.Show("兩個檔案不相等");
            }
        }

 

 

 

 

個人歸納出比較兩個檔案內容是否完全一樣的方法,詳情如下:

一.逐一比較位元組數

private bool CompareFile(string firstFile, string secondFile)
{
     if (!File.Exists(firstFile) || !File.Exists(secondFile)) {
         return false;
     }
     if (firstFile == secondFile) {
         return true;
     }
     int firstFileByte = 0;
     int secondFileByte = 0;
     FileStream secondFileStream = new FileStream(secondFile, FileMode.Open);
     FileStream firstFileStream = new FileStream(firstFile, FileMode.Open);
     if (firstFileStream.Length != secondFileStream.Length) {
         firstFileStream.Close();
         secondFileStream.Close();
         return false;
     }
     do
     {
         firstFileByte = firstFileStream.ReadByte();
         secondFileByte = secondFileStream.ReadByte();
     } while ((firstFileByte == secondFileByte) && (firstFileByte != -1)) ;
     firstFileStream.Close();
     secondFileStream.Close();
     return (firstFileByte == secondFileByte);
}
二.逐行比較內容

private bool CompareFileEx(string firstFile, string secondFile)
{
    if (!File.Exists(firstFile) || !File.Exists(secondFile)) {
        return false;
    }
    if (firstFile == secondFile) {
        return true;
    }
    string firstFileLine = string.Empty;
    string secondFileLine = string.Empty;
    StreamReader secondFileStream = new StreamReader(secondFile, Encoding.Default);
    StreamReader firstFileStream = new StreamReader(firstFile, Encoding.Default);
    do
    {
        firstFileLine = firstFileStream.ReadLine();
        secondFileLine = secondFileStream.ReadLine();
    } while ((firstFileLine == secondFileLine) && (firstFileLine != null));
    firstFileStream.Close();
    secondFileStream.Close();
    return (firstFileLine == secondFileLine);
}
三.比較雜湊碼

private bool CompareFileExEx(string firstFile, string secondFile)
{
    if (!File.Exists(firstFile) || !File.Exists(secondFile)) {
        return false;
    }
    if (firstFile == secondFile) {
        return true;
    }
    using (HashAlgorithm hash = HashAlgorithm.Create())
    {
        using (FileStream firstStream = new FileStream(firstFile, FileMode.Open), 
              secondStream = new FileStream(secondFile, FileMode.Open))
        {
            byte[] firstHashByte = hash.ComputeHash(firstStream);
            byte[] secondHashByte = hash.ComputeHash(secondStream);
            string firstString = BitConverter.ToString(firstHashByte); 
            string secondString = BitConverter.ToString(secondHashByte);
            return (firstString == secondString);
        }
    }
}
三種方法各有利弊,可根據具體情況具體分析,歡迎大家提出建議。
--------------------- 
作者:csdn_zhangchunfeng 
來源:CSDN 
原文:https://blog.csdn.net/csdn_zhangchunfeng/article/details/81093196 
版權宣告:本文為博主原創文章,轉載請附上博文連結!