简体   繁体   English

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

[英]Directory.EnumerateFiles returns no files in case of multiple extensions

I have a problem which I cannot handle with.我有一个我无法处理的问题。

When I use EnumerateFiles it returns no files, where I know there should be over 3k results.当我使用 EnumerateFiles 时,它不返回任何文件,我知道应该有超过 3k 个结果。

My code looks like here:我的代码如下所示:

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

    }

I took this code from here: Git link我从这里获取了这段代码: Git 链接

None of solutions work and I need this solution for multiple extensions.没有任何解决方案有效,我需要此解决方案进行多个扩展。 The only method worked for me is this:唯一对我有用的方法是:

private IEnumerable<string> GetCurrentFontFiles(string item)
    {
        IEnumerable<string> files = Directory.EnumerateFiles(item + Path.DirectorySeparatorChar, "*.ttf", SearchOption.AllDirectories).ToArray();
        return files;
    }

Which works, but only for single extension.哪个有效,但仅适用于单个扩展。

Please help me guys, I dont want to use GetFiles which is extremly slow (I have over 10k files in folder).请帮助我,我不想使用速度非常慢的 GetFiles(我的文件夹中有超过 10k 个文件)。

EDIT1 I call method with this filter: EDIT1我用这个过滤器调用方法:

string[] extensions = {"png"};

EDIT2编辑2

My example to reproduce:我的重现示例:

    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 Working solution EDIT3 工作解决方案

I know where was the problem.我知道问题出在哪里。 I modified a code and added missing SearchOption我修改了代码并添加了缺少的 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));
}

Your approach is slow because you are searching this folder that contains 10k files multiple times (for every extension).您的方法很慢,因为您正在多次搜索包含 10k 个文件的文件夹(对于每个扩展名)。 Instead you can use this:相反,您可以使用这个:

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

Obviously you also want to search subdirectories.显然您还想搜索子目录。 Then use AllDirectories .然后使用AllDirectories

As MicroVirus has commented it was case-sensitive.正如 MicroVirus 所评论的那样,它区分大小写。 Now it is case-insensitive.现在它不区分大小写。 So it doesn't matter if the extension is png or PNG .所以扩展名是png还是PNG并不重要。 Maybe that was causing your issue.也许这导致了您的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM