为什么通配符不能代表FindFirstFile中的目录?

时间:2017-01-17 11:12:38

标签: c windows winapi

我正在尝试使用FindFirstFile检查模式后是否存在某些文件,但看起来通配符*不能代表目录。

int main()
{
  WIN32_FIND_DATAW findFileData;
  wchar_t path[] = LR"(.\*\*.txt)";
  HANDLE hFind = FindFirstFileW(path, &findFileData);

  if(hFind != INVALID_HANDLE_VALUE)
  {
    do
    {
      printf("%S\n", findFileData.cFileName);
    } while (FindNextFileW(hFind, &findFileData));
  }
}

使用此树,不会打印任何内容:

.
|- foo
|  |- some.txt
|
|- bar
|  |- another.txt

为什么会出现这种限制?是否存在变通方法?

2 个答案:

答案 0 :(得分:6)

只有在最终路径分隔符后的文件名部分允许使用通配符。 documentation确实解释了这一点。它说:

  

目录或路径以及文件名。文件名可以包含通配符,例如星号(*)或问号(?)。

如果要搜索多个目录,则需要明确实现嵌套或递归迭代。

答案 1 :(得分:3)

正如documentation所述:

  

文件名可以包含通配符,例如星号(*)或问号(?)。

因此只有最后一部分可以有通配符,以前的部分必须是显式的。

您必须分两部分实现所需的功能:首先列出所有目录,然后使用通配符列出所有目录中的所有文件。