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

Ash*_*Ash 9 .net c# filesystems winapi

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

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);
    }
Run Code Online (Sandbox Code Playgroud)

t0m*_*13b 4

我能找到的最近的链接是Metasploit的系统调用列表...我在这里尝试一下,但我想这个“FindFirstFileEx”会以某种方式间接调用 NT 系统调用,相当于“NtOpenDirectoryObject”,“ NtQueryDirectoryFile','NtQueryDirectoryObject'...我希望...如果有人认为我错了并且投反对票不同意,那么任何不同意的人都会纠正我:)

不过,我在这里点击了一些链接

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

编辑:刚才在评论中提到后,我认为添加一个指向Linux NTFS 驱动程序的链接以获得读取 NTFS 分区的功能就足够了,肯定会有源版本更改以适应不同的 NTFS 版本到Win2000...

希望这有帮助,最诚挚的问候,汤姆。