我有一个我无法处理的问题。
当我使用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 link
没有一个解决方案可以工作,我需要这个解决方案用于多个扩展。对我有用的唯一方法是:
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));
}
答案 0 :(得分:6)
您的方法很慢,因为您正在多次搜索包含10k文件的文件夹(对于每个扩展名)。相反,你可以使用它:
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具有commented,因此区分大小写。现在它不区分大小写。因此,如果扩展名为png
或PNG
,则无关紧要。也许这会导致你的问题。