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

Posted

技术标签:

【中文标题】在 OpenFileDialog 中过滤文件的正则表达式【英文标题】:Regular expression to filter files in OpenFileDialog 【发布时间】:2010-09-14 00:01:22 【问题描述】:

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

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

谢谢, 尼基

【问题讨论】:

【参考方案1】:

我认为你不能这样做使用 OpenFileDialog 的 Filter 属性,它只是根据扩展名过滤文件列表。

我认为你必须让用户选择一个 xml 文件,如果它是 _1 文件,则验证然后再次弹出对话框。您可以在此验证中订阅 FileOK 事件和插槽。您可以在此处使用正则表达式来验证文件名。这是可以做到的最好的。我猜。

【讨论】:

是对的,你不能这样做。唯一的解决方案是选择文件后的验证。【参考方案2】:

OpenFileDialogEx described in this CodeProject article 是标准 OpenFileDialog 的扩展。该扩展的主要目的是修改对话框的显示,但还有一些额外的花里胡哨。例如,OFDEx 增加了一些事件,用于 File changed、Folder change 等。

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

根据this MSDN Mag article,

如果您使用 OFN_ENABLEINCLUDENOTIFY,Windows 发送 你的钩子程序一个 CDN_INCLUDEITEM 它添加到的每个项目的通知 打开列表。如果您返回 FALSE, Windows 排除该项目。 问题 是,Windows 不会通知您 普通文件,只有伪对象 比如命名空间扩展。当你 通过阅读文档 放大镜,打印是 非常清楚:“对话框 始终包括同时具有的项目 SFGAO_FILESYSTEM 和 SFGAO_FILESYSANCESTOR 属性, 无论返回的值如何 CDN_INCLUDEITEM。”显然 雷德蒙顿人添加了 CDN_INCLUDEITEM 为了他们自己的目的,这并没有 包括过滤普通文件名。

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

那么可以动态排除文件吗?嗯,是的,在 C++ 中;响应 CDN_FOLDERCHANGED 消息,您可以获取和设置包含文件的 CListCtrl 的内容。我还没有弄清楚如何在 C# 中设置这个列表。

【讨论】:

【参考方案3】:

OpenFileDialog 不支持这个。另一种方法是使用 3rd 方控件,例如 FileView,它允许您使用您希望的任何条件(例如正则表达式)过滤项目。

【讨论】:

【参考方案4】:

您应该可以使用以下过滤器来做到这一点: 数据文件|*_1.xml

【讨论】:

这样可以获取所有以 _1.xml 结尾的文件 他想要不以 _1.xml 结尾的文件。【参考方案5】:

我不确定如何使用 WinForms 在 C# 中执行此操作,但在 C++ 中,您要做的是安装自定义挂钩程序并侦听 CDN_INCLUDEITEM 通知。然后,根据您的正则表达式检查每个文件名。见http://msdn.microsoft.com/en-us/library/ms646960(VS.85).aspx#_win32_Filters。

【讨论】:

不正确。 CDN_INCLUDEITEM 仅针对命名空间扩展等伪对象发送,而不针对普通文件发送。这在文档中非常清楚:“对话框始终包含同时具有 SFGAO_FILESYSTEM 和 SFGAO_FILESYSANCESTOR 属性的项目,无论 CDN_INCLUDEITEM 返回的值如何。”在此处查看更多讨论:msdn.microsoft.com/en-us/magazine/cc300464.aspx 此处为文档:msdn.microsoft.com/en-us/library/ms646862(VS.85).aspx 底线: CDN_INCLUDEITEM 不会按照您在此处的建议进行操作。

以上是关于在 OpenFileDialog 中过滤文件的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

C# - 如何在 OpenFileDialog 中允许多种文件类型?

OpenFileDialog中的图像过滤器

将过滤器设置为 OpenFileDialog 以允许典型的图像格式?

OpenFileDialog C# 自定义过滤器,例如 'ABC*.pdf'

文件过滤器写法

OpenFileDialog 永久存储文件