如何在FindNextFileW中跳过点(。)和点(..)?

lea*_*erX -4 c++ windows winapi

FindNextFileW用来成功列出目录中的文件。问题在于,它使用引用自身,当前目录,并使用引用.父目录..。我试图使用if条件跳过这些,但它仍然会打印它们。

码:

int wmain() {

WIN32_FIND_DATAW data;
std::wstring dir = L"c:\\* ";
HANDLE hFind = FindFirstFileW(dir.c_str(), &data);

if (hFind != INVALID_HANDLE_VALUE) {
    do {
        wchar_t dot[] = L"." ;
        wchar_t dotd[] = L"..";

        if ( data.cFileName != dot && data.cFileName != dotd)
        std::wcout << data.cFileName << std::endl;
    } while (FindNextFileW(hFind, &data));
    FindClose(hFind);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我想跳过的印刷...使用的if条件。但是,它仍然打印它们。我在做什么错,我该如何解决?

编辑:

这个问题不是关于wchar_t数组无法比较的问题。很高兴知道这一点,但最终我的问题是如何跳过.and ..in FindNextFileW。我尝试转换为,std::wstring但随后可以定义:

std::wstring dot = '.';
std:wstring dotd = '..';
Run Code Online (Sandbox Code Playgroud)

但是,如何检查它们cFilename呢?

And*_*ers 5

您只是在比较指针,它们将永远不会相同。data.cFileName不是std::[w]string,而是纯C风格的字符串。

您可以使用lstrcmpW(),但是它们太短了,您甚至不必这样做,只需手动检查字符或使用辅助函数即可:

template<class T> bool IsDotOrDotDot(const T*s)
{
  if (s[0] == T('.'))
  {
    if (s[1] == T('\0')) return true; // .
    if (s[1] == T('.') && s[2] == T('\0')) return true; // ..
  }
  return false;
}

...

do {
  if (!IsDotOrDotDot(data.cFileName))
  {
    ...
  }
} while (...);
Run Code Online (Sandbox Code Playgroud)