2012-07-16 113 views
0

我已經在C++中創建了一個窗體窗體,在單擊按鈕時打開一個用於選擇文件夾的對話框。在目錄中列出文件

現在我想要做的是獲取該目錄中的文件列表,以便我可以逐個處理它們。

我用很多方式對它進行了搜索,發現了許多包含外部庫(如boost和diren.h)的方法。我不想使用外部資源,但是可以使用的是默認資源。

我已閱讀關於FindFirstFile和FindNextFile,但無法讓該組合工作。

您能否協助?

非常感謝, 伊丹。

下面是更新後的代碼:

HANDLE hFind; 
WIN32_FIND_DATA FindFileData; 
FolderBrowserDialog^ folderBrowserDialog1 = gcnew FolderBrowserDialog; 

if (folderBrowserDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) 
{ 
     String^selected = folderBrowserDialog1->SelectedPath; 

     selected += "\\*"; 

     char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(selected).ToPointer(); 

     hFind = FindFirstFile((LPCWSTR)stringPointer, &FindFileData); 
     while(hFind != INVALID_HANDLE_VALUE) 
     { 
      printf("Found file: %s\r\n", FindFileData.cFileName); 
      if(FindNextFile(hFind, &FindFileData) == FALSE) 
       break; 
     } 
} 
+2

你用FindFirstFile嘗試了什麼,你期望什麼,什麼不起作用? – harper 2012-07-16 10:29:05

+0

我添加了我的代碼。 基本上我想將文件名取到char *中,以便稍後使用它們。 – Idanis 2012-07-16 11:42:18

+0

好吧,我瞭解了你寫的內容的一部分,同時我發現了一種新的方法 - 請查看更新後的代碼。現在,我想(使用對話框)選擇一個目錄到「選定」變量。然後,我想迭代該目錄中的文件。我期待每個文件名都有一個char *,這樣我可以保存它們,然後再使用它們。再次感謝! – Idanis 2012-07-16 13:16:05

回答

0

你明明編譯UNICODE(寬字符),因爲你需要轉換爲中newstr的用FindFirstFile的lpFileName的對象參數。但是由於你傳遞了一個ANSI字符串,你可能不會得到有用的結果。你沒有寫,你期望找到。

在代碼beforer FindFirstFile中手動將SelectedPath值轉換爲ANSI char。無論如何,當你需要寬字符串時,這是沒有意義的。從StringToHGlobalUni方法中選擇的字符串中獲取LPCWSTR。這看起來在某種程度上是這樣的(未測試):

LPCWSTR stringPointer = Marshal::StringToHGlobalAnsi(selected).ToPointer(); 

hFind = FindFirstFile(stringPointer, &FindFileData); 

一般來說:不要使用強制類型轉換時,你需要適應不良設計的界面時除外。只有當你確切知道你在做什麼時才使用它。

此外,您不檢查FindFirstFile的hFind結果。如果您將指針傳遞給錯誤的字符串格式,則它將爲INVALID_HANDLE_VALUE。