【发布时间】:2010-02-12 00:48:27
【问题描述】:
我正在使用 Windows API 函数 FindFirstFileEx,因为它提供了仅返回给定目录的子目录的功能(忽略文件)。但是,当我使用 required 标志调用此函数时,我仍然会收到文件和目录。
FindFirstFileEx 使用的 FindExSearchLimitToDirectories 标志的 MSDN 文档说:
这是一个建议标志。如果文件 系统支持目录过滤, 该函数搜索一个文件 匹配指定的名称并且也是 一个目录。如果文件系统没有 不支持目录过滤,这个 标志被默默地忽略。
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);
}
【问题讨论】:
-
@Johannes,谢谢,我已经解决了这个问题。
-
您可能还想更改问题的标题
-
@John,是的。自我注意:OS != FS ;)
标签: c# .net winapi filesystems