2011-05-02 60 views
2

我正在使用C#ASP.NET應用程序我有文件夾名稱xyz,並在此文件夾中某些文件存儲爲像jpg,doc等與他們的具體名稱。保存文件重複搜索

但是,當我添加一個文件已經存在於此文件夾,但保存在不同的名稱。

我想問一下如何才能找到這樣的文件,名稱不同但實際上是一樣的?

+1

請給一個更有意義的標題你的問題。 – Oded 2011-05-02 06:57:07

+0

請格式化你的問題,很難理解你的問題..! – Misam 2011-05-02 06:57:22

+0

指定文件相同的條件。大小,創建日期,還有什麼? – abatishchev 2011-05-02 07:01:31

回答

3

你的問題很難理解,但我認爲你問如何識別重複文件:具有相同內容的不同文件。要做到這一點

的一種方式是進行散列每個文件的內容(使用散列函數,如SHA-1),並將結果存儲在Dictionary,使用哈希作爲密鑰,以及文件名作爲一個List值。如果兩個(或更多)文件具有相同的內容,它們將具有相同的散列值,因此它們將全部歸入字典中的相同密鑰下。在散列所有文件並將結果放入字典後,可以查看其值並檢查是否有任何列表包含多個項目。

2
void SaveFile(string fileName) 
{ 
    string folderPath = Server.MapPath("~/xyz"); 
    DirectoryInfo dirInfo = new DirectoryInfo(folderPath); 

    FileInfo fileInfo = new FileInfo(fileName); 

    // comparison algorithm based on size and creation date 
    bool exists = (from fi in dirInfo.EnumerateFiles(folderPath) 
        where fi.Size == fileInfo.Size && 
         fi.CreationTimeUtc == fileInfo.CreationTimeUtc 
        select fi).Any(); 

    // comparison algorithm based on hash 
    string fileHash = ComputeHash(fileInfo.FullPath); 
    bool exists = (from fi in dirInfo.EnumerateFiles(folderPath) 
        where String.Equals(
         ComputeHash(fi.FullPath), 
         fileHash, 
         StringComparison.Ordinal) 
        select fi).Any();      
} 

一個示例如何獲取文件的MD5散列,see more

string ComputeHash(string fileName) 
{ 
    byte[] bytes; 
    using (Stream stream = new FileStream(fileName, FileMode.Open)) 
    { 
     MD5 md5 = new MD5CryptoServiceProvider(); 
     bytes = md5.ComputeHash(stream); 
    } 

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

如果我理解正確的問題,您想知道2個文件是相同的文件,即使它們具有不同的文件名。

我想你可以通過字節讀取每個文件的字節,並比較:

public static bool AreEqual(string f1, string f2) 
{ 
    var fi1 = new FileInfo(f1); 
    var fi2 = new FileInfo(f2); 

    // first check that they are the same size, obviously a pre-req for them being equal 
    if (f1.Length != f2.Length) 
    { 
     return false; 
    } 

    var sr1 = new FileStream(f1, FileMode.Open); 
    var sr2 = new FileStream(f2, FileMode.Open); 

    for (int i = 0; i < f1.Length; i++) 
    { 
     byte[] left = new byte[1]; 
     byte[] right = new byte[1]; 
     sr1.Read(left, i, 1); 
     sr2.Read(right, i, 1); 
     if (left[0] != right[0]) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
+0

非常好的答案是非常有幫助的 – 2011-05-04 05:51:05