【发布时间】:2019-10-28 13:30:35
【问题描述】:
我正在使用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检查它们?
【问题讨论】:
-
任何类型的数组都无法与内置运算符进行比较。
-
SIZE_T FileNameLength = wcslen(data.cFileName); switch (FileNameLength) { case 2: if (data.cFileName[1] != '.') break; case 1: if (data.cFileName[0] == '.') continue; } -
“这个问题不是关于如何无法比较 wchar_t 数组” 这正是它的意义所在。
wchar_t数组包含的内容无关紧要,因此FindNextFileW(以及一般的 Windows API)也无关紧要。分而治之。减少你的问题。 -
多次重复。您可以通过执行字符串比较来跳过这些项目。