2

私はこのコードを使用しています

       private IEnumerable<String> FindAccessableFiles(string path, string file_pattern, bool recurse)
    {
        IEnumerable<String> emptyList = new string[0];

        if (File.Exists(path))
            return new string[] { path };

        if (!Directory.Exists(path))
            return emptyList;

        var top_directory = new DirectoryInfo(path);

        // Enumerate the files just in the top directory.
        var files = top_directory.EnumerateFiles(file_pattern);
        var filesLength = files.Count();
        var filesList = Enumerable
                  .Range(0, filesLength)
                  .Select(i =>
                  {
                      string filename = null;
                      try
                      {
                          var file = files.ElementAt(i);
                          filename = file.FullName;                              
                      }
                      catch (UnauthorizedAccessException)
                      {
                      }
                      catch (InvalidOperationException)
                      {
                          // ran out of entries
                      }
                      return filename;
                  })
                  .Where(i => null != i);

        if (!recurse)
            return filesList;

        var dirs = top_directory.EnumerateDirectories("*");
        var dirsLength = dirs.Count();
        var dirsList = Enumerable
            .Range(0, dirsLength)
            .SelectMany(i =>
            {
                string dirname = null;
                try
                {
                    var dir = dirs.ElementAt(i);
                    dirname = dir.FullName;
                    return FindAccessableFiles(dirname, file_pattern, recurse);
                }
                catch (UnauthorizedAccessException)
                {
                }
                catch (InvalidOperationException)
                {
                    // ran out of entries
                }

                return emptyList;
            });
        return Enumerable.Concat(filesList, dirsList);
    }

100,000 個以上のファイルが含まれるフォルダーを繰り返し処理する際に、いくつかのパフォーマンスの問題が発生しています。それらを列挙するときに無視するすべての画像です。

列挙されたリストからそれらを除外する方法を考え出そうとしているので、そもそも処理されませんが、その方法はわかりません。

List<String>除外したい拡張子があり、を使用してコードでこれを行いますContains

FindAccessableFilesそもそもそれらを除外した場合、パフォーマンスは向上しますか?また、どのように行うのですか? 私の最初の試みは、ファイル拡張子が拡張子リストに含まれている場合に例外をスローすることでしたが、これが最善の方法ではないと確信しています。

の目的は、許可エラーをスローしたファイルにアクセスしようとして例外をスローするFindAccessableFiles問題を回避したファイルのリストを作成することです。GetFiles()

4

2 に答える 2

1

JaredPar に同意します。再列挙しないようにしてください。返品には .ToList() が必要ですが、それもvar files = top_directory.EnumerateFiles(file_pattern);必要です。

例外処理はコストがかかるため、持っている以上のものを追加することはお勧めできません。ファイルの列挙は、探している種類のフィルタリングをサポートしていないため、どこかで手動で行う必要があります。おそらくこれを行うのが最善です。

filename = excludedExtensionList.Any(e => e == file.Extension) ? null : file.FullName;

それでもパフォーマンスの問題がある場合は、操作をより小さなチャンクに分割できる方法を検討する必要があります。ファイル名が信頼できる場合は、EnumerateFiles パターンを変更するスキームを考え出すことができるかもしれません (すべて「a」、「b」、「c」などで始まるファイル)。または、大量のジャンクがすべて同じフォルダにある場合、ディレクトリ構造を変更して、不要なファイルが常に無視できるサブフォルダにあるようにすることはできますか?

于 2013-08-21T15:46:19.513 に答える