2012-01-02 89 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