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呢?
您只是在比较指针,它们将永远不会相同。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)
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |