使用文件对话框选择包含特定文件类型的文件夹?
Use file dialog to select a folder that contains a specific file type?
我们的应用程序将其项目保存为一个包含内容的文件夹,包括实际的项目文件 something.abc
加载项目时,我们必须进入项目文件夹并找到项目文件,这是一个小问题。我知道有文件夹选择操作系统对话框,但我只希望它能在它看到文件夹中存在的文件时才起作用。
我确定我看到了这个完成,但我不知道如何...我们正在使用Qt,但欢迎对此或Windows本机提供答案。一件事是我想使用本机操作系统对话框,而不是从头开始构建自己的对话框。
Win32SHBrowseForFolder()
和IFileOpenDialog
API 都允许用户选择文件夹。
这两个 API 都允许您对对话框事件做出反应,例如对当前文件夹选择的更改、对当前选择的验证等。SHBrowseForFolder()
有一个回调函数,IFileOpenDialog
有一个IFileDialogEvents
接收器接口。
此类回调/接收器可以检查当前选定的文件夹是否具有给定的文件类型,然后阻止或允许对话框将该结果返回给调用方。
SHBrowseForFolder()
要检查文件类型是否存在,请执行以下操作:
- 通过将文件夹的绝对 PIDL 传递给
SHGetPathFromIDList()
来获取文件夹的文件系统路径。 - 然后使用具有所需文件名模式掩码的
FindFirstFile()
搜索该路径。
或
- 通过将文件夹的绝对 PIDL 传递给
SHBindToObject()
来检索IShellFolder
接口(或者在 Vista 之前的系统上,使用SHGetDesktopFolder()
获取顶级桌面 shell 命名空间的IShellFolder
,然后将 PIDL 传递给其BindToObject()
方法(。 - 然后使用
IShellFolder::EnumObjects()
方法获取其IEnumIDList
接口。 - 然后枚举文件的相对 PIDL,使用父文件夹的
IShellFolder::GetDisplayNameOf()
方法来查找与所需文件名模式匹配的文件。
若要阻止或允许对话框向调用方返回成功,回调函数可以处理BFFM_SELCHANGED
通知以根据需要验证文件夹,然后向对话框窗口发送一条BFFM_ENABLEOK
消息,lParam
相应地设置为零或非零。
IFileOpenDialog
要检查文件类型是否存在,请执行以下操作:
- 使用文件夹的
IShellItem::BindToHandler()
方法检索其IEnumShellItems
接口。 - 然后枚举文件的
IShellItem
接口,使用IShellItem::GetDisplayName()
方法查找与所需文件名模式匹配的文件。
若要阻止或允许对话框将成功返回给调用方,接收器可以实现OnFileOk
事件来验证所选文件夹并根据需要返回S_OK
或S_FALSE
。
或者,接收器可以实现OnFolderChange
事件以直接启用/禁用对话框的 OK 按钮(在这种情况下IFileDialogCustomize::SetControlState()
不起作用(:
- 通过查询对话框的
IOleWindow
接口,然后调用其GetWindow()
方法来检索对话框的HWND
。 - 然后使用 Win32
GetDlgItem()
函数通过标准IDOK
控件 ID 获取"确定"按钮的HWND
。 - 然后使用 Win32
EnableWindow()
函数启用/禁用按钮。
- 通过C++从目录中过滤特定文件类型
- Ini 文件类型名称 预期C++
- 用于随机数据访问的最有效文件类型
- Visual Studio 2019 - 设置文件类型的默认扩展名
- 如何使用C++将.trc文件类型转换为文本文件?
- 如何指定可以打开的文件类型
- 更改代码::块上的默认保存文件类型
- 使用文件对话框选择包含特定文件类型的文件夹?
- MFC,查找特定文件类型
- 搜索并限制为特定文件类型VS2017
- 是否可以将Visual Studio 2017将C 代码编译到EXE以外的文件类型中
- VIM:执行复杂文件类型的脚本和显示结果
- 功能"fread()"不读取特定文件类型?
- 如何在用户修改后使用旧版驱动程序中的 PE 标头获取原始文件类型
- 在makefile中更改构建规则以构建多种文件类型
- 使QT/C 程序显示其文件类型,如Windows上已知
- 是否可以将其他文件类型添加到Visual Studios清理过程中
- 强制将特定文件编译为Objective-C/文件类型,但将整个项目编译为Objective C++
- 如何从FindFirstFile()中获取多个文件类型是可能的吗
- 跨平台方式获取用户友好的文件类型描述