0

我在 C++ 中创建了一个 Windows 窗体,单击按钮会打开一个用于选择文件夹的对话框。

现在我想做的是获取该目录中的文件列表,以便我可以一一处理它们。

我用谷歌搜索了很多方法,发现了很多方法,其中包括外部库(例如 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;
        }
}
4

1 回答 1

0

您显然是为 UNICODE(宽字符)编译的,因为您需要为 FindFirstFile 的 lpFileName 参数转换 newStr。但是由于您传递了一个 ANSI 字符串,因此您可能不会得到有用的结果。你没有写,你期望找到什么。

在 FindFirstFile 之前的代码中,您手动将 SelectedPath 值转换为 ANSI 字符。无论如何,当您需要一个宽字符字符串时,这没有任何意义。从使用 StringToHGlobalUni 方法选择的字符串中获取 LPCWSTR。这看起来像这样(未经测试):

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

hFind = FindFirstFile(stringPointer, &FindFileData); 

一般来说:不要使用强制转换,除非您需要调整设计不佳的界面。仅当您确切知道自己在做什么时才使用它。

此外,您不会检查 FindFirstFile 的 hFind 结果。如果您传递一个指向错误字符串格式的指针,它将是 INVALID_HANDLE_VALUE。

于 2012-07-16T12:50:08.210 回答