【问题标题】:Get count of files from directory without enumerating files in c#从目录中获取文件数而不在c#中枚举文件
【发布时间】:2014-08-11 09:10:28
【问题描述】:

我正在使用 Directory.EnumerateFiles()Directory.GetFiles() 来获取 c# 中特定目录中的文件数。问题是这些方法很慢,因为它们会枚举文件以达到计数。

如何在c#中不枚举文件的情况下获取目录中的文件数?

【问题讨论】:

  • 简短回答:不,没有。即使你得到一些 API 来做到这一点,它也会在内部枚举。
  • 但如果目录包含很多文件(超过 50000 个),则需要的时间太长。这是不可能的

标签: c# file directory


【解决方案1】:

必须枚举文件夹以获取所有文件。

但是,您仍然可以做一些事情来提高性能。我建议你看看那些基准测试(Get1 方法):

https://stackoverflow.com/a/17756559/3876750

根据基准测试,似乎以下方法提供了最佳性能:

private static int Get1(string myBaseDirectory)
{
    DirectoryInfo dirInfo = new DirectoryInfo(myBaseDirectory);
    return dirInfo.EnumerateDirectories()
           .AsParallel()
           .SelectMany(di => di.EnumerateFiles("*.*", SearchOption.AllDirectories))
           .Count();
}

【讨论】:

  • 我是在做一些奇怪的事情,还是这也不会在 baseDir 中搜索文件?
  • 啊这是因为它在枚举目录,但不搜索自己。
【解决方案2】:

我实际上从未尝试过更快的方法,但这是一个很好的问题。通过搜索我找到了这个

http://www.codeproject.com/Articles/38959/A-Faster-Directory-Enumerator

基准比较看起来相当不错..

也许这有帮助..

【讨论】:

  • 我已经多次使用 FastDirectoryEnumerator 类,它比所有内置的枚举方法都快得离谱。它通过避免大量预分配、缓存中间结果和并行运行任务来实现这一点。强烈推荐!
【解决方案3】:

嗨,也许这有助于它返回字符串[]

String[] files = Directory.GetFileSystemEntries("path");

【讨论】:

    【解决方案4】:

    我认为您必须使用 Directory.GetFiles()DirectoryInfo 类。

    优点是,您可以使用 GetFIles 的重载来搜索子目录中的文件,例如

    int allfilesCount = Directory.GetFiles(path, "*", SearchOption.AllDirectories).Length;
    

    MSDN DirectoryInfo

    你可以试试

    Directory.EnumerateFiles().Count() 
    

    如果它更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多