2012-07-16 110 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。