[英]Directory.EnumerateFiles returns no files in case of multiple extensions
I have a problem which I cannot handle with.我有一个我无法处理的问题。
When I use EnumerateFiles it returns no files, where I know there should be over 3k results.当我使用 EnumerateFiles 时,它不返回任何文件,我知道应该有超过 3k 个结果。
My code looks like here:我的代码如下所示:
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));
}
I took this code from here: Git link我从这里获取了这段代码: Git 链接
None of solutions work and I need this solution for multiple extensions.没有任何解决方案有效,我需要此解决方案进行多个扩展。 The only method worked for me is this:
唯一对我有用的方法是:
private IEnumerable<string> GetCurrentFontFiles(string item)
{
IEnumerable<string> files = Directory.EnumerateFiles(item + Path.DirectorySeparatorChar, "*.ttf", SearchOption.AllDirectories).ToArray();
return files;
}
Which works, but only for single extension.哪个有效,但仅适用于单个扩展。
Please help me guys, I dont want to use GetFiles which is extremly slow (I have over 10k files in folder).请帮助我,我不想使用速度非常慢的 GetFiles(我的文件夹中有超过 10k 个文件)。
EDIT1 I call method with this filter: EDIT1我用这个过滤器调用方法:
string[] extensions = {"png"};
EDIT2编辑2
My example to reproduce:我的重现示例:
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 Working solution EDIT3 工作解决方案
I know where was the problem.我知道问题出在哪里。 I modified a code and added missing SearchOption
我修改了代码并添加了缺少的 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));
}
Your approach is slow because you are searching this folder that contains 10k files multiple times (for every extension).您的方法很慢,因为您正在多次搜索包含 10k 个文件的文件夹(对于每个扩展名)。 Instead you can use this:
相反,您可以使用这个:
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));
}
Obviously you also want to search subdirectories.显然您还想搜索子目录。 Then use
AllDirectories
.然后使用
AllDirectories
。
As MicroVirus has commented it was case-sensitive.正如 MicroVirus 所评论的那样,它区分大小写。 Now it is case-insensitive.
现在它不区分大小写。 So it doesn't matter if the extension is
png
or PNG
.所以扩展名是
png
还是PNG
并不重要。 Maybe that was causing your issue.也许这导致了您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.