在多个扩展的情况下,Directory.EnumerateFiles不返回任何文件

use*_*355 0 c#

我有一个我无法处理的问题.

当我使用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)

Tim*_*ter 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));
}
Run Code Online (Sandbox Code Playgroud)

显然你也想搜索子目录.然后用AllDirectories.

正如MicroVirus 评论的那样,它区分大小写.现在它不区分大小写.因此,如果扩展名是png或者无关紧要PNG.也许这是导致你的问题.