Winapi 如何在对话框中仍显示文件名的情况下将IFileDialog与FOS_PICKFOLDER一起使用

Winapi 如何在对话框中仍显示文件名的情况下将IFileDialog与FOS_PICKFOLDER一起使用,winapi,Winapi,我正在尝试使用IFileDialog来选择一个文件夹,下面的代码可以很好地完成这项工作。问题是我希望在浏览时看到某些文件类型以及文件夹(例如*.txt)。有没有一个简单的方法可以做到这一点 //g_path is a global which will contain the selected folders path void PickContainer() { IFileDialog *pfd; if (SUCCEEDED(CoCreateInstance(CLSID_Fil

我正在尝试使用IFileDialog来选择一个文件夹,下面的代码可以很好地完成这项工作。问题是我希望在浏览时看到某些文件类型以及文件夹(例如*.txt)。有没有一个简单的方法可以做到这一点

//g_path is a global which will contain the selected folders path
void PickContainer()
{
    IFileDialog *pfd;
    if (SUCCEEDED(CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd))))
    {
        DWORD dwOptions;
        if (SUCCEEDED(pfd->GetOptions(&dwOptions)))
        {
            pfd->SetOptions(dwOptions | FOS_PICKFOLDERS);
        }
        if (SUCCEEDED(pfd->Show(NULL)))
        {
            IShellItem *psi;
            if (SUCCEEDED(pfd->GetResult(&psi)))
            {
                if(!SUCCEEDED(psi->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &g_path)))
                {
                    MessageBox(NULL, "GetIDListName() failed", NULL, NULL);
                }
                psi->Release();
            }
        }
        pfd->Release();
    }
}

一旦您选择了
FOS_PICKFOLDERS
,您将无法在对话框中看到文件,只能看到文件夹。如果省略文件夹,则不能选择文件夹,只能选择文件。标准对话框不支持您的要求。您可以编写自己的对话框,但我倾向于找到一种方法来组织您的应用程序,以适应标准对话框的行为。

遗憾的是,现在不可能,Microsoft似乎忽略了对该功能的请求:

这并不是要更好地组织应用程序。标准对话框对用户来说仍然不是最好的(尽管它比Vista之前的选项好得多)——我发现当我四处浏览时,所有文件夹都是空的,这让我感到困惑,即使我的最终目标恰好是一个文件夹而不是一个文件,我感兴趣的是将文件和文件夹的集合添加到文件归档中。无法从一个标准对话框中同时选择这两个对话框是令人讨厌的。围绕“你可以添加文件或文件夹,但不能同时添加两者”重新组织应用程序没有意义。我收集自定义对话框是唯一的选项。我完全不喜欢fadden,它不是关于“更好地组织应用程序”,有些用例只需要用户能够选择文件和文件夹,而没有Microsoft dialog支持这一点确实令人痛苦:(@Erk支持在选择文件夹时显示文件;通过使用。很遗憾,IFileDialog不支持API中的功能,它被设计为替代。请注意,如果您使用上述代码,当您使用
g_path
中包含的路径时,应该使用
CoTaskMemFree()来释放它)
。有关详细信息,请参阅。非常感谢您的代码片段!虽然这不是我的问题,但该代码片段对我来说也是完美无瑕的。