在windows下用c ++列出目录

时间:2012-01-02 15:30:00

标签: c++ c windows directory listings

我想列出当前目录的所有文件,所以我有这段代码:

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

有人能帮助我吗?

3 个答案:

答案 0 :(得分:4)

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.问题是,您在编写代码时不知道它将是

根据您的构建设置,您可以拥有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

需要考虑的事情。

答案 1 :(得分:3)

您正在使用std::cout输出宽字符字符串。请改用std::wcout

答案 2 :(得分:1)

我希望你有一个Unicode / ANSI不匹配。要打印Unicode字符串,请使用std::wcout