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

时间:2015-10-30 15:12:25

标签: 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));

    }

我从这里开始使用此代码: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));
}

1 个答案:

答案 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,因此区分大小写。现在它不区分大小写。因此,如果扩展名为pngPNG,则无关紧要。也许这会导致你的问题。