Windows 在不使用FindFirstFile的情况下迭代目录中的文件

Windows 在不使用FindFirstFile的情况下迭代目录中的文件,windows,winapi,file,directory,loops,Windows,Winapi,File,Directory,Loops,在Windows操作系统上,如何在不使用第三方库或FindFirstFile、FindNextFile等的情况下迭代给定目录中的文件?如果FindFirstFile是Windows中的主要文件枚举方法,您还希望得到什么?FindFirstFile调用了NT API函数(ZwQueryDirectoryFile和类似函数),但它们更复杂,没有带来真正的好处 如果您能够使用托管代码,那么使用托管代码编程就容易一些 返回的可枚举集合 指定路径中的文件名 我所知道的在目录中列出文件的唯一其他方法是使用对

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

如果FindFirstFile是Windows中的主要文件枚举方法,您还希望得到什么?FindFirstFile调用了NT API函数(ZwQueryDirectoryFile和类似函数),但它们更复杂,没有带来真正的好处

如果您能够使用托管代码,那么使用托管代码编程就容易一些

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


我所知道的在目录中列出文件的唯一其他方法是使用对象,它是Windows脚本库的一部分。您可以在C++、Delphi或支持访问COM.< /P>的任何语言中使用这个对象。 在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

出于好奇,FindFirstFile有什么问题吗?制作一个浏览器窗口的屏幕截图并进行OCR?Win32通常不提供两种不同的方法来完成完全相同的工作。@Hans有不止一种方法可以剥猫皮,正如谚语所说:)。Explorer,据我所知(我可能会弄错)绕过FindFirstFile并直接调用低级函数。@Martinho、Hans和peterchen,我有一个应用程序可以列出目录中的文件,我正在试图弄清楚它是如何做的,因为它不使用FindFirstFile,即使它列在DLL的导入部分。这不是真正的好处吗?对于初学者来说,您可以使用APC,但更好的是,本机函数可以并且将返回尽可能多的条目,只要它能放入传递的缓冲区中(假设
ReturnSingleEntry
FALSE
)。这会导致更少的函数调用,并且通常应该更快。也许没有使用MFT解析的速度快,但是。@0xC000002L您有一些数字吗?我看到一些人试图优化目录扫描,他们的结果并没有那么有希望。但这可能是操作系统特有的。ZwQueryDirectoryFile似乎没有快多少(我理解并支持您关于对多个条目使用一个调用的观点)。当然,对FAT或MFT的直接解析确实会有所不同。问题是这种方法对于网络驱动器来说太慢了,在我的例子中,它会超过10-20分钟。但当我通过Windows资源管理器转到同一目录时,工作正常。