我正在使用Windows API函数FindFirstFileEx,因为它提供了仅返回给定目录的子目录(忽略文件)的功能。但是当我用必需的标志调用这个函数时,我仍然会收到文件和目录。
FindFirstFileEx使用的FindExSearchLimitToDirectories标志的MSDN文档说:
这是一个咨询标志。如果是文件 系统支持目录过滤, 该函数搜索一个文件 匹配指定的名称,也是 一个目录。如果文件系统有 不支持目录过滤,这个 flag被默默地忽略了。
的lpSearchFilter参数 FindFirstFileEx函数必须为NULL 何时使用此搜索值。
如果需要目录过滤, 此标志可用于所有文件 系统,但因为它是一个咨询 标记并仅影响文件系统 应用程序必须支持它 检查存储的文件属性数据 在lpFindFileData参数中 FindFirstFileEx函数来确定 该函数是否已返回 处理目录。
那么,哪些文件系统实际上支持这个标志?在同一页面上实际列出这些支持的文件系统是明智的,但我找不到它。
我的开发系统是Windows XP SP3,NTFS,.NET 3.5。
我知道我可以检查文件属性以确定文件是否是目录,但这意味着检查每个文件/目录。它也首先违背了使用FindFirstFileEx的目的。
当然,我的代码中仍有可能出错。我唯一能看到的是将IntPtr.Zero传递给lpSearchFilter可能与传递NULL不同(如引用中所述)。
以下是我正在使用的代码示例:
m_searchDirHandle = WinAPI.FindFirstFileEx(@"C:\Temp\*",
WinAPI.FINDEX_INFO_LEVELS.FindExInfoStandard ,
ref m_findDirData, WinAPI.FINDEX_SEARCH_OPS.FindExSearchLimitToDirectories,
IntPtr.Zero , 0);
if (m_searchDirHandle != WinAPI.INVALID_HANDLE_VALUE)
{
do
{
foundNextDir = WinAPI.FindNextFile(m_searchDirHandle, ref m_findDirData);
} while (foundNextDir);
}
答案 0 :(得分:4)
我能找到的最近的链接是Metasploit的系统调用列表...我在这里采取了一个刺,但我想这个'FindFirstFileEx'会以某种方式间接调用NT系统调用等效的'NtOpenDirectoryObject','NtQueryDirectoryFile','NtQueryDirectoryObject'......我希望......如果有人认为我错了并且不同意,我会被不同意的人纠正:)
但是,我在这里找到了一些链接
编辑:刚才在评论中提到之后,我认为添加Linux NTFS driver链接以获取读取NTFS分区的功能是合适的,必然会是源版本更改,以适应不同的NTFS版本回到Win2000 ...
希望这有帮助, 最好的祝福, 汤姆。