按文件内容筛选的打开文件对话框

4

我通常使用TOpenDialogFilter属性来缩小用户可用文件的范围。我希望进一步通过它们的内容来过滤这些文件。

例如,打开文件对话框只应显示具有“.bin”文件扩展名其前4个魔术字节为0x7F、0x45、0x4C、0x46(ELF可执行文件)的文件。

该条件不一定总是识别某些可执行格式,还可能包括其他二进制数据。

在Delphi/VCL中是否有标准方法来实现此功能,还是我必须推迟内容检查,直到用户选择了文件?


我会尝试使用一些旧组件来创建自己的对话框:Mustang Peak VirtualShellTools(https://code.google.com/p/mustangpeakvirtualshelltools/)或Embarcadero的版本(http://sourceforge.net/projects/embtvstools/),以及TFindFile(http://www.delphiarea.com/products/delphi-components/findfile/)来过滤内容。请参见http://knowisinc.com/wpdname.html以获取示例。 - Max Williams
我被锁定无法完成编辑。不管怎样,WPDName通过检查每个文件的前三个字节来识别旧的Word Perfect文件。如果您需要,我可以提供源代码。 - Max Williams
1个回答

6
没有办法实现你想要的功能。系统文件对话框不允许你根据文件内容来过滤它所显示的文件。 OnIncludeItem 事件似乎可以做到你需要的功能,但它存在以下问题:
  1. 该事件包含 CDN_INCLUDEITEM 通知。该通知由旧版XP公共对话框触发,而现代公共项目对话框则不会触发。因此,使用该事件会将旧版XP公共对话框强制添加到程序中。这在外观上有缺陷。
  2. 更重要的是,处理 CDN_INCLUDEITEM 对文件没有影响,它只影响非文件系统 shell 对象。根据文档

对话框始终包括具有 SFGAO_FILESYSTEM 和 SFGAO_FILESYSANCESTOR 属性的项,无论 CDN_INCLUDEITEM 返回的值如何。

相关问题:

原来你是对的。(之前试图删除我的答案,但只读模式阻止了它。不得不等待。)谢谢。 - Ken White
@Ken NP。你有一段时间怀疑了。 - David Heffernan
结果证明是我的错误。我的测试文件夹中的第一个*.bat文件(巧合地)与测试过滤器(Pos('test', FileName) > 0)匹配,因此在文件夹下方显示的内容似乎已经被正确过滤了。当我看到你的回答后,我回去仔细检查并意识到了这个错误,然后回来删除答案,但无法删除。 :-) - Ken White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接