【问题标题】:File system support for FindFirstFileEx, limit to directoriesFindFirstFileEx 的文件系统支持,仅限于目录
【发布时间】: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


【解决方案1】:

我能找到的最近的链接是Metasploit 的系统调用列表...我在这里尝试一下,但我想这个“FindFirstFileEx”会以某种方式间接调用 NT 系统调用等价物'NtOpenDirectoryObject', 'NtQueryDirectoryFile', 'NtQueryDirectoryObject'...我希望...如果有人认为我错了并且不同意,我会被不同意的人纠正:)

但是,我在这里点击了一些链接

  • CodeGuru论坛关于这个问题的flag
  • Wine 将邮件列为无效标志?
  • GenNT 提到它显然仅限于 NTFS,(该帖子有 3 条回复)
  • SO 上,关于“如何获取此文件夹中的文件夹列表”的问题

编辑:刚才在cmets中提到之后,我认为添加一个指向Linux NTFS driver的链接来读取NTFS分区的功能就足够了,肯定有源版本更改以适应可追溯到 Win2000 的不同 NTFS 版本...

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

  • 另外,这可能取决于您使用的ntfs 版本。我相信 WinXP 的时间框架发生了一些变化。
  • @John:我倾向于同意,因为 NTFS 发生了变化(从 Vista 开始,与新的引导加载程序方法有关),而且 XP 家庭版和专业版在 NTFS 上有一个关键区别——安全性,专业的,你可以设置权限,在Home下不可用...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多