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

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

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

谢谢,尼基

我不认为你可以使用OpenFileDialog的Filter属性来做到这一点 ,它只是根据扩展名过滤文件列表。

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

此CodeProject文章中描述的OpenFileDialogEx是标准OpenFileDialog的扩展。 该扩展的主要目的是修改对话框的显示,但还有一些额外的花里胡哨。 例如,OFDEx添加了一些事件,用于文件更改,文件夹更改等。

有人指出,CDN_INCLUDEITEM通知似乎满足了过滤对话框中显示的文件列表的愿望。 它似乎会,但它没有。 CDN_INCLUDEITEM不会执行您的想法或想要的操作。

根据MSDN Mag的这篇文章 ,

如果使用OFN_ENABLEINCLUDENOTIFY创建对话框,Windows会为您添加到打开列表的每个项目发送一个CDN_INCLUDEITEM通知。 如果返回FALSE,Windows将排除该项目。 问题是,Windows不会通知您普通文件,只会通知名称空间扩展等伪对象。 当您通过放大镜阅读文档时,打印非常清晰:“对话框始终包含具有SFGAO_FILESYSTEM和SFGAO_FILESYSANCESTOR属性的项目,无论CDN_INCLUDEITEM返回的值如何。” 显然,Redmondtonians为了自己的目的添加了CDN_INCLUDEITEM,其中不包括过滤普通文件名。

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

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

OpenFileDialog不支持此function。 另一种方法是使用像FileView这样的第三方控件,它允许您使用任何标准过滤项目,例如正则表达式。

您应该能够使用以下filter:数据文件| * _1.xml

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