【问题标题】:Open file dialog filter by file contents按文件内容打开文件对话框过滤器
【发布时间】:2014-03-11 14:36:09
【问题描述】:

我通常使用TOpenDialog 及其Filter 属性来缩小用户可用文件的范围。我想通过它们的内容进一步过滤这些文件。

例如,打开文件对话框应该只显示带有“.bin”文件扩展名的文件并且它的前 4 个magic bytes 是 0x7F、0x45、0x4C、0x46(ELF 可执行文件)。

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

在 Delphi/VCL 中是否有执行此操作的标准方法,或者我是否必须将内容检查推迟到用户选择文件之后?

【问题讨论】:

标签: delphi vcl


【解决方案1】:

没有办法达到你想要的。系统文件对话框不允许您根据内容过滤它显示的文件。

OnIncludeItem 事件似乎可以满足您的需求。但是,它存在以下问题。

  1. 事件包含CDN_INCLUDEITEM 通知。此通知由旧版 XP 通用对话框触发,但不是由现代通用项对话框触发。因此,使用该事件会强制将旧版 XP 通用对话框添加到您的程序中。如果没有其他原因,这有美观的缺点。
  2. 更重要的是,处理CDN_INCLUDEITEM 对文件没有影响。它只影响非文件系统 shell 对象。形成documentation:

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

相关问题:

【讨论】:

  • 事实证明你是对的。 (之前试图删除我的答案,但只读阻止了它。不得不等待。)谢谢。
  • @Ken NP。你有一段时间怀疑了。
  • 原来是我的错。我的测试文件夹中的第一个 *.bat 文件(巧合)与测试过滤器匹配(Pos('test', FileName) > 0),因此文件夹下方对话框中可见的内容似乎已正确过滤。当我阅读您的答案时,我回去仔细检查并意识到错误,回来删除答案,但无法删除。 :-)
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2011-10-02
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多