2012-05-02 44 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))... –