2012-05-02 47 views
2

我有兩個文件目錄,我想確保兩個文件都相同。因此我創建了一個查詢將所有文件放入FileInfo數組中。我通過它們的FileName對所有文件進行了分組,並且現在要爲每個組比較兩個文件的'LastWriteAccess'和'Length'。Fast FileSize與Linq比較

但說實話,就像我這樣做,它的速度很慢。任何想法如何我可以比較一個組內的文件關於他們的長度,並讓我做'''',如果不同?

... 

FileInfo[] fiArrOri5 = d5ori.GetFiles("*.*", System.IO.SearchOption.TopDirectoryOnly); 
FileInfo[] fiArrNew5 = d5new.GetFiles("*.*", System.IO.SearchOption.TopDirectoryOnly); 

FileInfo[] AllResults = new FileInfo[fiArrNew5.Length+fiArrOri5.Length]; 
fiArrNew5.CopyTo(AllResults, 0); 
fiArrOri5.CopyTo(AllResults, fiArrNew5.Length); 

var duplicateGroups = AllResults.GroupBy(file => file.Name); 

     foreach (var group in duplicateGroups) 
     { 
      AnzahlElemente = group.Count(); 

      if (AnzahlElemente == 2) 
      { 
       if (group.ElementAt(0).Length != group.ElementAt(1).Length) 
       { 
        // do sth 
       } 
      } 

      ... 
     } 

編輯:

,如果我只運行下面的代碼片段,它運行超級快。 (〜00:00:00:0005156)

Console.WriteLine(group.ElementAt(0).LastWriteTime); 

如果我只運行下面的代碼片段,它運行速度非常慢。 (〜00:00:00:0750000)

Console.WriteLine(group.ElementAt(1).LastWriteTime); 

任何想法爲什麼?

+1

你想爲每一個不同的文件做一些事情?或者只是兩個目錄之間有什麼區別? –

+0

緩慢的部分可能會從磁盤讀取FileInfo,對於每個文件... –

+0

Do Sth =如果'原始'目錄的文件具有更新的'LastWriteAccess'日期或不同'長度'的文件「鏡像」目錄中的複製作業將開始替換鏡像側的文件。 Slow Part是ElementAt(0)與ElementAt(1)的'比較'。如果我刪除IF部分,程序將在幾秒鐘內完成400.000個文件。如果我用當前給定的方式進行比較,則需要6個小時。這就是爲什麼我問是否有另一種選擇來比較像我一樣。 –

回答

1

我不知道這會更快一些 - 但是這是我怎麼會做這樣的:

var folderPathOne = "FolderPath1"; 
var folderPathTwo = "FolderPath2"; 

//Get all the filenames from dir 1 
var directoryOne = Directory 
    .EnumerateFiles(folderPathOne, "*.*", SearchOption.TopDirectoryOnly) 
    .Select(Path.GetFileName); 

//Get all the filenames from dir 2 
var directoryTwo = Directory 
    .EnumerateFiles(folderPathTwo, "*.*", SearchOption.TopDirectoryOnly) 
    .Select(Path.GetFileName); 

//Get only the files that appear in both directories 
var filesToCheck = directoryOne.Intersect(directoryTwo); 

var differentFiles = filesToCheck.Where(f => new FileInfo(folderPathOne + f).Length != new FileInfo(folderPathTwo + f).Length); 

foreach(var differentFile in differentFiles) 
{ 
    //Do something 
} 
+0

'System.IO.Directory'不包含'EnumerateFiles'的定義。我也沒有發現任何相似之處。 –

+0

您使用的是什麼版本的.Net?我認爲這可能只是.Net 4.0 ...你可以使用.GetFiles()來代替 - 但是在這種情況下它會慢很多:( –

+0

這種方法(或者類似的,先使用兩組相交)應該解決它。事情是OrderBy使用延遲執行,所以實際的計算是在需要的時候執行的。所產生的IEnumerable中的IGrouping <>項中的第一個元素相對於源IEnumerable是順序的,並且Linq可能很難優化(我認爲它在O(n * log n)中執行它,但它可能發生它是O(n^2))... –