我有一个我无法处理的问题.
当我使用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));
}
Run Code Online (Sandbox Code Playgroud)
我从这里拿了这个代码:Git链接
没有解决方案可行,我需要这个解决方案用于多个扩展.对我有用的唯一方法是:
private IEnumerable<string> GetCurrentFontFiles(string item)
{
IEnumerable<string> files = Directory.EnumerateFiles(item + Path.DirectorySeparatorChar, "*.ttf", SearchOption.AllDirectories).ToArray();
return files;
}
Run Code Online (Sandbox Code Playgroud)
哪个有效,但仅适用于单个扩展.
请帮助我们,我不想使用速度非常慢的GetFiles(文件夹中有超过10k的文件).
EDIT1 我用这个过滤器调用方法:
string[] extensions = {"png"};
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)
您的方法很慢,因为您正在多次搜索包含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));
}
Run Code Online (Sandbox Code Playgroud)
显然你也想搜索子目录.然后用AllDirectories.
正如MicroVirus 评论的那样,它区分大小写.现在它不区分大小写.因此,如果扩展名是png或者无关紧要PNG.也许这是导致你的问题.