如何跳过 FindNextFileW 中的点 (.) 和点点 (.)

How to skip the dot (.) and dotdot (..) in FindNextFileW?

本文关键字:何跳过 FindNextFileW      更新时间:2023-10-16

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

如您所见,我试图通过使用if条件跳过...的打印。但是,它仍然打印它们。我做错了什么,我该如何解决?

编辑:

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

std::wstring dot = '.';
std:wstring dotd = '..';

但是我如何对照cFilename检查它们?

你只是在比较指针,它们永远不会相同。 data.cFileName不是std::[w]string,它只是一个普通的C型字符串。

您可以使用 lstrcmpW() ,但这些太短了,您甚至不必这样做,只需手动检查字符或使用辅助功能:

template<class T> bool IsDotOrDotDot(const T*s)
{
  if (s[0] == T('.'))
  {
    if (s[1] == T('')) return true; // .
    if (s[1] == T('.') && s[2] == T('')) return true; // ..
  }
  return false;
}
...
do {
  if (!IsDotOrDotDot(data.cFileName))
  {
    ...
  }
} while (...);
<</div> div class="answers">

你可以做:

if (wcscmp (data.cFileName, dot) != 0 && wcscmp (data.cFileName, dotd) != 0)
    ...

另请注意:

wchar_t dot[] = L"." ;

应该是:

const wchar_t dot[] = L"." ;

同样适用于dotd.

如果使用 C++17,您可能还想查看std::filesystem