如何跳过 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
相关文章:
- 无论我使用什么,我的输入都会被跳过
- C++ If/Else 语句被跳过
- 转换器练习:跳过 if 语句和 if 语句
- C++ cin.ignore() 跳过循环
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- CIN 仅在输入非数字值时跳过下一个 CIN
- 提升精神 x3 解析为结构,如果它为空,则跳过成员
- 在 if 语句中使用 GetKeyState 时,它会跳过条件
- 而循环跳过 cin.getline() 对于 C 字符串
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- 如果以下行不包含决策或分支,GDB 无法单步跳过函数
- 跳过输入并输出 garabge 值
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 通过跳过可选参数来填充参数包
- ifstream 跳过数字,只写 0
- 如何在跳过所有内部实现的同时跳转到 GDB 中 std::function 中的函数?
- 图形初学者C++(跳过控制台)?
- C++用于循环跳过向量的元素?
- 解码H264流时如何跳过帧?
- 链表遍历跳过值