【问题标题】:Iterating files in a directory without using FindFirstFile在不使用 FindFirstFile 的情况下迭代目录中的文件
【发布时间】:2011-06-08 00:10:12
【问题描述】:

在 Windows 操作系统上,如何在不使用第三方库或使用 FindFirstFile、FindNextFile 等的情况下迭代给定目录中的文件?

【问题讨论】:

  • 出于好奇,FindFirstFile 有什么问题?
  • 制作资源管理器窗口的截图和OCR吗? Win32 通常不会提供两种不同的方法来完成完全相同的工作。
  • @Hans 正如谚语所说,给猫剥皮的方法不止一种:)。 Explorer,据我所知(我在这里可能会误会)绕过 FindFirstFile 并直接调用较低级别的函数。
  • @Martinho、Hans 和 peterchen,我有一个可以列出目录中文件的应用程序,我试图弄清楚它是如何做到的,因为它不使用 FindFirstFile,即使它列在 DLL 的导入部分中。

标签: windows winapi file directory loops


【解决方案1】:

鉴于 FindFirstFile 是 Windows 中的主要文件枚举方法,您还期望得到什么?有 NT API 函数(ZwQueryDirectoryFile 和类似的),它们由 FindFirstFile 调用,但它们更复杂并且没有真正的好处。

【讨论】:

  • 没有真正的好处?对于初学者,您可以使用 APC,但更好的是本机函数可以并且将返回尽可能多的条目,因为它可以适合传递的缓冲区(假设 ReturnSingleEntryFALSE)。这会导致更少的函数调用,并且通常应该更快。但是,可能不如使用 MFT 解析那么快。
  • @0xc0000022l 你有数字吗?我看到几个人试图优化目录扫描,但他们的结果并不乐观。但也许这是特定于操作系统的。 ZwQueryDirectoryFile 似乎并没有快多少(我理解并支持你关于使用一个调用来获取多个条目的观点)。当然,直接解析 FAT 或 MFT 确实会产生影响。
  • 问题是这种方法对于网络驱动器来说太慢了,在我的情况下它需要超过 10-20 分钟。但是当我通过 Windows 资源管理器转到同一目录时工作正常。
【解决方案2】:

如果您能够使用托管代码,则使用Directory.EnumerateFiles 编程会更容易一些。

返回一个可枚举的集合 指定路径中的文件名。

【讨论】:

    【解决方案3】:

    我知道列出目录中文件的唯一其他方法是使用 Windows 脚本库中的 Scripting.FileSystemObject 对象。您可以在 C++、delphi 或任何支持访问 COM 的语言中使用此对象。

    在 vbscript 中查看此示例代码

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objStartFolder = "C:\test"
    Set objFolder = objFSO.GetFolder(objStartFolder)
    Set colFiles = objFolder.Files
    For Each objFile in colFiles
        Wscript.Echo objFile.Name
    Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2018-04-17
      • 2020-10-14
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多