在所有子目录中查找具有特定扩展名的文件数

Esp*_*spo 19 c# recursion file

有没有办法找到特定类型的文件数,而无需在Directory.GetFiles()或类似方法中循环遍历所有结果?我正在寻找这样的东西:

int ComponentCount = MagicFindFileCount(@"c:\windows\system32", "*.dll");
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建一个递归函数来调用Directory.GetFiles,但是如果我能在没有所有迭代的情况下做到这一点会更加清晰.

编辑:如果没有递归和迭代自己不可能做到这一点,那么最好的方法是什么?

Jon*_*jap 35

您应该使用Directory.GetFiles()Directory.GetFiles(path,searchPattern,SearchOption)重载.

Path指定路径,searchPattern指定通配符(例如,*,*.format),SearchOption提供包含子目录的选项.

此搜索的返回数组的Length属性将为您的特定搜索模式和选项提供正确的文件计数:

string[] files = directory.GetFiles(@"c:\windows\system32", "*.dll", SearchOption.AllDirectories);

return files.Length;
Run Code Online (Sandbox Code Playgroud)

编辑:或者您可以使用Directory.EnumerateFiles方法

return Directory.EnumerateFiles(@"c:\windows\system32", "*.dll", SearchOption.AllDirectories).Count();
Run Code Online (Sandbox Code Playgroud)

  • @DavidHAust原因是[`GetFiles`方法](http://msdn.microsoft.com/en-us/library/07wt70x2.aspx)将实现目录中*整个*文件列表.现在调用的首选方法是[`Directory.EnumerateFiles`](http://msdn.microsoft.com/en-us/library/dd383571.aspx),因为它将流回文件(通过`yield`-like机制)因为对OS的底层调用会产生结果. (6认同)

Dea*_*ean 8

最简单的方法是使用linq:

var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
                    select file).Count();
Run Code Online (Sandbox Code Playgroud)

  • 为什么不`Directory.EnumerateFiles(@"H:\ iPod_Control\Music","*.mp3",SearchOption.AllDirectories).Count()` (6认同)

jfs*_*jfs 7

您可以使用GetFiles的这个重载:

Directory.GetFiles方法(String,String,SearchOption)

和SearchOption的这个成员:

AllDirectories - 包括搜索操作中的当前目录和所有子目录.此选项包括重新分析点,如安装的驱动器和搜索中的符号链接.

GetFiles返回一个字符串数组,因此您只需获取Length,即找到的文件数.


Sau*_*eil 6

我一直在寻找更优化的版本.由于我还没有找到它,我决定编码并在此处分享:

    public static int GetFileCount(string path, string searchPattern, SearchOption searchOption)
    {
        var fileCount = 0;
        var fileIter = Directory.EnumerateFiles(path, searchPattern, searchOption);
        foreach (var file in fileIter)
            fileCount++;
        return fileCount;
    }
Run Code Online (Sandbox Code Playgroud)

使用GetFiles/GetDirectories的所有解决方案都很慢,因为需要创建所有这些对象.使用枚举,它不会创建任何临时对象(FileInfo/DirectoryInfo).

有关更多信息,请参阅备注http://msdn.microsoft.com/en-us/library/dd383571.aspx