0

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

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

没有一个解决方案有效,我需要这个解决方案来进行多个扩展。对我有用的唯一方法是:

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"};

编辑2

我的重现示例:

    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));
}
4

1 回答 1

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所说,它是区分大小写的。现在它不区分大小写。所以扩展名是png还是都没有关系PNG。也许这导致了你的问题。

于 2015-10-30T15:21:18.113 回答