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

时间:2010-02-12 00:48:28

标签: c# .net winapi filesystems

我正在使用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);
    }

1 个答案:

答案 0 :(得分:4)

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

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

    关于国旗的
  • CodeGuru论坛
  • Wine有一个邮件列为旗帜,没有效果?
  • GenNT提到它显然仅限于NTFS,(该帖子有3条回复)
  • 此处SO,有关“如何获取此文件夹中的文件夹列表”的问题

编辑:刚才在评论中提到之后,我认为添加Linux NTFS driver链接以获取读取NTFS分区的功能是合适的,必然会是源版本更改,以适应不同的NTFS版本回到Win2000 ...

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