文件系统支持FindFirstFileEx,限制目录

我正在使用Windows API函数FindFirstFileEx,因为它提供了仅返回给定目录的子目录(忽略文件)的function。 但是,当我使用required标志调用此函数时,我仍然会收到文件和目录。

FindFirstFileEx使用的FindExSearchLimitToDirectories标志的MSDN文档说:

这是一个咨询标志。 如果文件系统支持目录过滤,则该函数将搜索与指定名称匹配的文件,并且也是目录。 如果文件系统不支持目录过滤,则会以静默方式忽略此标志。

使用此搜索值时,FindFirstFileEx函数的lpSearchFilter参数必须为NULL。

如果需要目录过滤,则此标志可用于所有文件系统,但由于它是一个顾问标志并且仅影响支持它的文件系统,因此应用程序必须检查存储在FindFirstFileEx函数的lpFindFileData参数中的文件属性数据确定函数是否已返回目录的句柄。

那么,什么文件系统实际上支持这个标志? 实际在同一页面上列出这些支持的文件系统是明智的,但我找不到它。

我的开发系统是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); } 

我能找到的最近的链接是, Metasploit的系统调用列表…我在这里采取了一个刺,但我想这个’FindFirstFileEx’会以某种方式间接调用NT系统调用等效’NtOpenDirectoryObject’,’ NtQueryDirectoryFile’,’NtQueryDirectoryObject’……我希望……如果有人认为我错了并且不同意,我将会被不同意见的人纠正:)

但是,我在这里找到了一些链接

  • 关于这个问题的CodeGuru论坛
  • 葡萄酒有一个邮件列为旗帜,没有效果?
  • GenNT提到它显然仅限于NTFS,(该post有3条回复)
  • 在这里,关于’如何获取此文件夹中的文件夹列表’的问题

编辑:刚刚在评论中提到之后,我认为添加一个链接到Linux NTFS驱动程序以获取读取NTFS分区的function是合适的,必然会有源版本更改以适应不同的NTFS版本返回到Win2000 ……

希望这会有所帮助,最好的问候,汤姆。