0

私には対処できない問題があります。

EnumerateFiles を使用すると、3k 以上の結果が必要であることがわかっている場合、ファイルは返されません。

私のコードは次のようになります。

private IEnumerable<string> TestGetFiles(string path, params string[] exts)
    {
        var extsAsWildcards = exts.Select(x => "*." + x).ToArray();
        return exts.Select(x => "*." + x) .SelectMany(x => Directory.EnumerateFiles(path, x));

    }

ここからこのコードを取得しました:Gitリンク

どのソリューションも機能せず、複数の拡張機能にこのソリューションが必要です。私のために働いた唯一の方法はこれです:

private IEnumerable<string> GetCurrentFontFiles(string item)
    {
        IEnumerable<string> files = Directory.EnumerateFiles(item + Path.DirectorySeparatorChar, "*.ttf", SearchOption.AllDirectories).ToArray();
        return files;
    }

これは機能しますが、単一の拡張子に対してのみです。

私を助けてください、私は非常に遅いGetFilesを使いたくありません(フォルダに10k以上のファイルがあります)。

EDIT1 このフィルターを使用してメソッドを呼び出します。

string[] extensions = {"png"};

EDIT2

再現する私の例:

    private IEnumerable<string> TestGetFiles(string path, params string[] exts)
    {
        return exts.Select(x => "*." + x).SelectMany(x => Directory.EnumerateFiles(path, x));
    }
    private List<FileSizeList> GetPNGFiles(string pathForFiles)
    {
        List<FileSizeList> PNGFiles = new List<FileSizeList>();

        string[] extensions = {"png"};
        IEnumerable<string> files = TestGetFiles(pathForFiles, extensions);
        foreach (var file in files)
        { //no iteration here

        }
    }

EDIT3作業ソリューション

どこに問題があったかはわかっています。コードを修正し、不足している SearchOption を追加しました

private IEnumerable<string> TestGetFiles(string path, params string[] exts)
{
    var extensions = exts
       .Select(x => x.StartsWith(".") ? x : "." + x)
       .ToArray();
    return Directory.EnumerateFiles(path,"*.*",SearchOption.AllDirectories)
        .Where(fn => extensions.Contains(Path.GetExtension(fn), StringComparer.InvariantCultureIgnoreCase));
}
4

1 に答える 1

6

10,000 個のファイルを含むこのフォルダーを (拡張子ごとに) 複数回検索しているため、アプローチが遅くなります。代わりにこれを使用できます:

private IEnumerable<string> TestGetFiles(string path, params string[] exts)
{
    var extensions  = exts
       .Select(x => x.StartsWith(".") ? x : "." + x)
       .ToArray();
    return Directory.EnumerateFiles(path ,SearchOption.AllDirectories)            
       . Where(fn => extensions.Contains(Path.GetExtension(fn), StringComparer.InvariantCultureIgnoreCase));
}

明らかに、サブディレクトリも検索する必要があります。次に、 を使用しますAllDirectories

MicroVirus がコメントしているように、大文字と小文字が区別されます。大文字と小文字が区別されなくなりました。pngしたがって、拡張子がか かは関係ありませんPNG。たぶんそれがあなたの問題を引き起こしていました。

于 2015-10-30T15:21:18.113 に答える