列出目录中的文件

时间:2012-07-16 10:25:46

标签: visual-c++

我在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;
        }
}

1 个答案:

答案 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。