【问题标题】:*FASTEST* directory listing*最快*目录列表
【发布时间】:2011-04-04 17:06:45
【问题描述】:

我有大量目录,我想尽可能快地读取所有文件。我的意思是,不是 DirectoryInfo.GetFiles 快,而是 'get-clusters-from-disk-low-level' 快。

当然,.NET 2.0、c#

类似的问题在这里,但这种方法没有任何好处:

C# Directory listing massive directory

有人建议在 FindFirst/FindNext 上使用 pInvoke。有人尝试过并且能够分享结果吗?

【问题讨论】:

  • 使用反射器看起来 DirectoryInfo.GetFiles 最终归结为 FindFirstFile/FindNextFile kernel32 调用。

标签: c# file-io directory


【解决方案1】:

对于“正常”的方法,基本上一切都归结为FindFirstFile/FindNextFile,你并没有真正比这更快......而且这不是超级快速。

如果您真的需要速度,请考虑手动阅读 MFT - 但要知道这需要管理员权限,并且在 NTFS 更新时容易中断(而且,哦,是的,不会的t 适用于非 NTFS 文件系统)。您可能想看看 this codeUSN 和 MFT 的东西。

但是,也许有不同的解决方案。如果您的应用程序不断运行并且需要获取更改,您可以先通过慢速FindFirstFile/FindNextFile 传递,然后使用目录更改通知支持来获知更新......这适用于有限用户,并且不依赖于文件系统结构。

【讨论】:

    【解决方案2】:

    为了获得最佳性能,可以 P/Invoke NtQueryDirectoryFile,记录为 ZwQueryDirectoryFile。

    (直接访问磁盘和直接读取原始文件系统结构,这通常是不实用的。)

    【讨论】:

      【解决方案3】:

      尝试使用this DirectoryManager 之类的内容,并根据您的需要对其进行改进。比 .NET Framework GetDirectories()GetFiles() 运行得更快,因为我们省略了跨平台检查和调整。

      【讨论】:

      • 非常不错的小班,它使用FindFirstFile/FindNextFile。就我个人而言,我会在此处添加代码副本,而不是链接到另一个站点,以防万一出现故障。
      • @Eugene Cheverda DirectoryManager 链接不再有效:P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2011-01-05
      • 2013-03-31
      • 1970-01-01
      • 2015-06-17
      • 2017-08-25
      相关资源
      最近更新 更多