使用正则表达式过滤OpenFileDialog中的文件

时间:2020-03-06 14:52:25  来源:igfitidea点击:

我想知道如何在打开的文件对话框中过滤文件(在Winforms中)
基于正则表达式。文件具有所有相同的扩展名(.xml)。
大文件被拆分为多个同名文件,仅用_1 ...分隔。
我们只想显示不带_1的文件(第一个数据文件)

打开文件对话框有一个属性过滤器,但我不知道如何以文件名格式指定它,因此不使用正则表达式。

谢谢,
尼基

解决方案

我认为我们无法使用OpenFileDialog的Filter属性来完成此操作,该属性仅根据扩展名过滤文件列表。

我认为我们必须让用户选择一个xml文件,进行验证,如果对话框为_1文件,则再次弹出该对话框。我们可以订阅FileOK事件并在那里进行此验证的插槽。我们可以在此处使用正则表达式来验证文件名。那是可以做到的最好的..我想。

我不确定如何在Cwith WinForms中执行此操作,但是在C ++中,我们将执行的操作是安装自定义钩子过程并侦听CDN_INCLUDEITEM通知。然后,我们对照正则表达式检查每个文件名。请参阅http://msdn.microsoft.com/zh-cn/library/ms646960(VS.85).aspx#_win32_Filters。

OpenFileDialog不支持此功能。一种替代方法是使用诸如FileView之类的第三方控件,该控件可让我们使用所需的任何条件(例如正则表达式)来过滤项目。

此CodeProject文章中介绍的OpenFileDialogEx是标准OpenFileDialog的扩展。该扩展程序的主要目的是修改对话框的显示,但还有一些其他功能。例如,OFDEx添加了一些事件,例如文件更改,文件夹更改等。

有人指出CDN_INCLUDEITEM通知似乎可以满足过滤对话框中显示的文件列表的愿望。似乎会,但事实并非如此。 CDN_INCLUDEITEM不会执行我们可能想或者想要的操作。

根据MSDN Mag的这篇文章,

If you create your dialog with
  OFN_ENABLEINCLUDENOTIFY, Windows sends
  your hook procedure a CDN_INCLUDEITEM
  notification for every item it adds to
  the open list. If you return FALSE,
  Windows excludes the item. The problem
  is, Windows doesn't notify you for
  ordinary files, only pseudo-objects
  like namespace extensions. When you
  read the documentation through a
  magnifying glass, the print is
  perfectly clear: "The dialog box
  always includes items that have both
  the SFGAO_FILESYSTEM and
  SFGAO_FILESYSANCESTOR attributes,
  regardless of the value returned by
  CDN_INCLUDEITEM." Apparently the
  Redmondtonians added CDN_INCLUDEITEM
  for their own purposes, which didn't
  include filtering ordinary file names.

换句话说,作为对CDN_INCLUDEITEM的响应,我们不能为常规文件返回FALSE,以将其从对话框中排除。与文档所说的相反,对于常规文件,CDN_INCLUDEITEM的响应被忽略,以我的经验,甚至对于常规文件,CDN_INCLUDEITEM甚至都不发送,至少在我的Vista机器上没有。

那么有可能动态排除文件吗?好吧,是的,在C ++中;作为对CDN_FOLDERCHANGED消息的响应,我们可以获取并设置包含文件的CListCtrl的内容。我还没有弄清楚如何在C#中设置此列表。

我们应该可以使用以下过滤器执行此操作:
数据文件| * _1.xml