私には対処できない問題があります。
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));
}