我想列出当前目录的所有文件,所以我有这段代码:
int WLoader::listdir(void)
{
WIN32_FIND_DATA data;
std::wstring path(L"*");
std::wstring *name;
HANDLE hFile = FindFirstFile(path.c_str(), &data);
if (hFile == INVALID_HANDLE_VALUE)
return (-1);
while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES)
{
std::cout << data.cFileName << std::endl;
}
return (0);
}
由于未知原因,我的程序显示了这个结果:
0029F29C
0029F29C
0029F29C
0029F29C
0029F29C
0029F29C
有人可以帮帮我吗?
最佳答案
The WIN32_FIND_DATA
structure's member cFileName
is a TCHAR[N]
, 和 TCHAR
is a Windows type alias that maps either to char
or wchar_t
.问题是,您在编写代码时不知道会是哪一个。
根据您的build设置,您可以使用 char*
或 wchar_t*
;一个应该与 std::cout
一起使用,另一个必须与 std::wcout
一起使用。但是你用哪一个?!
幸运的是,有一个宏可以在编译时找出正在使用的宏:
while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) {
#ifdef UNICODE
std::wcout << data.cFileName << std::endl;
#else
std::cout << data.cFileName << std::endl;
#endif
}
如果您尝试将文件名分配给 std::string
/std::wstring
,您会发现同样的问题。这就是使用 Windows API 的好处。 :)
解决此问题的一种方法是为输出流和字符串定义宏。
因此,在程序顶部的某处:
#ifdef UNICODE
#define STDCOUT std::wcout
#define STDSTR std::wstring
#else
#define STDCOUT std::cout
#define STDSTR std::string
#endif
那么在你的函数中,你只需要:
while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) {
STDCOUT << data.cFileName << std::endl;
}
并且您可以在别处使用 STDSTR
。
需要考虑的事情。
关于c++ - 在windows下用c++列出目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702543/