2

2 つのファイル ディレクトリがあり、両方が同一であることを確認したい。したがって、すべてのファイルを FileInfo 配列に配置するクエリを作成しました。すべてのファイルを FileName でグループ化し、グループごとに「LastWriteAccess」と「Length」の両方のファイルを比較したいと考えています。

しかし、正直なところ、私がこれを行うように、遅くはありません。グループ内のファイルの長さについてLinqを介して比較し、異なる場合は「sth」を実行させる方法はありますか?

...

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);

理由はありますか?

4

1 に答える 1

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
}
于 2012-05-02T11:14:23.220 に答える