有没有办法通过标准的OPENFILE对话框选择向用户显示哪些文件?

时间:2012-12-10 22:07:30

标签: c++ winapi mfc fileopendialog

Vista引入了一个接口:IFileDialog :: SetFilter,它允许我设置一个过滤器,为每个可能的文件名调用它,看看它是否应该显示给用户。

Microsoft在Windows 7中删除了它,并且在XP中不支持它。

我正在尝试自定义“打开文件”对话框,以便我可以控制向最终用户显示哪些文件。这些文件在内部用产品代码标记 - 文件名本身没有任何东西可以过滤(因此文件扩展名过滤器在这里没用 - =我需要实际询问每一个以查看它是否在额外过滤器内我们的用户指定的参数。)

我猜微软会删除SetFilter界面,因为它太慢了。我可以想象出各种类似的想法,这些想法对于网络和云存储都没有很好的扩展性以及你有什么。

但是,我需要知道是否有一个替代接口可以实现相同的目标,或者我是否仅限于在文件对话框中仅查看文件扩展名以进行过滤?


随访:
在进一步研究需要pre-vista版本的OPENFILENAME的CDN_INCLUDEITEM之后,我发现这是可以想象的最无用的API。它只过滤非文件系统对象。换句话说,您无法使用它来过滤文件。或文件夹。人们可以过滤99.99%的文件打开或保存对话框的时间。令人难以置信!

有一个非常古老的article by Paul DiLascia,它提供了每次更新列表视图时从列表视图控件中删除每个违规文件名的技术。

但是,我从痛苦的经历中知道列表视图可以随时更新。如果您正在查看大文件夹(许多项目)或连接速度有点(负载很重的服务器和/或大量文件),则文件将逐个添加到对话框中。因此,必须重复过滤掉有问题的文件名。

实际上,我们当前的自定义文件打开对话框使用计时器定期查看视图的文件名列表,以查看是否存在给定模式的任何文件,以便启用另一个控件。否则,可以检查这些文件是否存在,找不到,但片刻之后,视图会更新以包含更多文件名,并且不会向对话框发送任何事件来指示视图已更改。实际上,多年来我不得不为通用控件文件对话框编写和维护代码的经验是,在谈到如何编写这样的东西时,微软并不是很有头脑。事件不完整,在无用的时间发送,在没有必要时重复,并且不存在整类有用的通知。

可悲的是,我想我可能不得不放弃这个想法。除非有人想到如何在用户尝试与其交互时如何能够跟上视图的自发变化(即,从列表视图中删除条目并更改用户的视觉位置会很尴尬,或突出显示的文件,或滚动位置等。)

2 个答案:

答案 0 :(得分:2)

您需要初始化CFileDialog的回调。然后,您需要处理CDN_INCLUDEITEM notification code以包含或排除项目。

您还可以查看this great article。除了回调之外,作者还使用了其他一些方法

答案 1 :(得分:1)

正如您已经发现的那样,从Windows 7开始,不再可能根据内容过滤出文件,只能过滤文件扩展名。但是,在允许关闭对话框之前,您可以验证用户选择的文件是否可接受,如果不是,则向用户显示消息框并保持对话框打开。除非您创建自己的自定义对话框,否则这是您能做的最好的事情。