c++ - 允许 IFileOpenDialog 选择一个尚未创建的文件

标签 c++ winapi openfiledialog

我在许多应用程序中都看到过这一点。您可以选择打开文件,如果文件不存在,则会创建文件,您不会收到任何投诉。全部来自同一个打开文件对话框。 我使用 IFileOpenDialog 打开一个文件,如果我输入一个不存在的文件,它会显示一个错误,我无法获得该文件的路径。

我想要的不是得到错误而是接受不存在的文件名。稍后我会创建它。这可能吗?

if (SUCCEEDED(hr))
{
    IFileOpenDialog *pFileOpen;

    // Create the FileOpenDialog object
    hr = CoCreateInstance(
        CLSID_FileOpenDialog,
        NULL, 
        CLSCTX_ALL, 
        IID_IFileOpenDialog, 
        reinterpret_cast<void**>(&pFileOpen)
    );

    if (SUCCEEDED(hr))
    {
        // Show the Open dialog box.
        hr = pFileOpen->Show(NULL);

        // Get the file name from the dialog box.
        if (SUCCEEDED(hr))
        {
            IShellItem *pItem;
            hr = pFileOpen->GetResult(&pItem);
            if (SUCCEEDED(hr))
            {
                PWSTR pszFilePath;
                hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);

                // Check if file actually exists
                if (SUCCEEDED(hr))
                {
                    // Create file if not found
                    if (PathFileExists(pszFilePath) != 1)
                    {

                    }

                    CoTaskMemFree(pszFilePath);
                }
                pItem->Release();
            }
        }
        pFileOpen->Release();
    }
    CoUninitialize();
}

最佳答案

调用 IFileDialog::GetOptions 获取默认选项,删除 FOS_PATHMUSTEXIST 和 FOS_FILEMUSTEXIST 位,然后使用 IFileDialog::SetOptions 设置新选项。

关于c++ - 允许 IFileOpenDialog 选择一个尚未创建的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48435984/

相关文章:

c++ - Visual Studio 2008 编译器不会在 C++ 中使用 sqrt 自动转换为 double 吗?

c++ - COM 对象生命周期

winapi - 如何以编程方式创建位图?

c# - 选择多个 CSV 并批量写入数据库

c++ - 将自动生成的 ID 保存到文件中

c++ - 当不在包含路径中时,Eclipse CDT 自动引入/usr/include/boost

c# - OpenFileDialog 多选问题

c# - OpenFileDialog InitialDirectory 不接受相对路径吗?

c# - 如何判断我的应用程序是否已从剪贴板监听器链中删除?

c - 如何在 Win32 中为整个屏幕着色纯色