2012-01-02 65 views
1

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

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 

有人可以帮我吗?

+1

它似乎是输出cFileName元素的地址指针,而不是它包含的字符串。你有没有尝试过使用printf()呢? – 2012-01-02 15:31:50

+0

是的,它适用于printf,但我需要将cFileName转换为字符串,因为我需要它来打开一个dll。所以我认为如果我不能写出正确的文件名称,我不能将正确的名称写入字符串。 – 2012-01-02 15:34:52

+0

@NickShaw:这是一个可怕的想法。显然他正在尝试流传什么;只能回到石器时代才可能掩盖这个问题,并且可能会使情况变得更糟。 – 2012-01-02 15:35:41

回答

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别处。

需要考虑的事情。

+0

好吧,我明白了。谢谢你的帮助。 – 2012-01-02 16:30:38

+0

@Yumino:你很受欢迎。 – 2012-01-03 01:07:37

3

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

+0

如果我想把cFileName放入一个字符串? – 2012-01-02 15:35:42

+0

@Yumino你已经在使用'std :: wstring'作为路径,继续使用它。 – 2012-01-02 15:38:30

+0

把它放到'wstring' – 2012-01-02 15:38:58

1

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