我在c ++中创建了一个窗口表单,单击按钮后会打开一个用于选择文件夹的对话框。
现在我想要的是获取该目录中的文件列表,以便我可以逐个处理它们。
我用多种方式搜索它,并找到了许多方法,包括外部库(如boost和diren.h)。我不想使用外部资源,但我可以使用的是默认资源。
我读过有关FindFirstFile和FindNextFile的内容,但无法让这个组合起作用。
你能帮忙吗?
非常感谢, IDAN。
以下是更新后的代码:
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;
}
}
答案 0 :(得分:0)
您显然需要为UNICODE(宽字符)编译,因为您需要为FindFirstFile的lpFileName参数强制转换newStr。但是,由于您传递了ANSI字符串,因此很可能无法获得有用的结果。你没有写,你期望找到什么。
在代码之前的FindFirstFile中,您手动将SelectedPath值转换为ANSI char。无论如何,当你需要一个宽字符串时,这没有任何意义。从使用StringToHGlobalUni方法选择的String中获取LPCWSTR。这看起来像这样(未经测试):
LPCWSTR stringPointer = Marshal::StringToHGlobalAnsi(selected).ToPointer();
hFind = FindFirstFile(stringPointer, &FindFileData);
一般情况下:除非需要调整设计不良的界面,否则不要使用强制转换。只有在您确切知道自己在做什么时才使用它。
此外,您不检查FindFirstFile的hFind结果。如果将指针传递给错误的字符串格式,则为INVALID_HANDLE_VALUE。