C# OpenFileDialog 多个文件名过滤器,包括排除

问题描述

我要求允许用户打开特定文件进行处理。打开文件对话框当前是

        OpenFileDialog ofg = new OpenFileDialog
        {
            FileName = "BaseFileName*",Filter = "CSV File (*.CSV)|*.csv",Multiselect = false,InitialDirectory = @"N:\Downloads"
        }; 

但是,该进程在文件名中添加了 _Processed 后缀和时间戳数据,我想在下次使用 OpenFileDialog 时排除这些重命名文件,以防止用户尝试重新处理同一文件

出于内部审计的原因,我必须将原始文件留在原处。

所以我需要一个不等于“_Processed”的附加文件名过滤器。

有没有办法用 OpenFileDialog 做到这一点,或者有人知道可以做到这一点的自定义 c#/.net 组件吗?

解决方法

您要求从文件对话框视图中省略特定项目。

根据 MSDN,这在 Windows 7 中不再可能,但以前是可能的。

C# 文件对话框(WPF 和 WinForms)使用 IFileDialog API。

这是本可以完成这项工作但不再受支持的功能:

https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifiledialog-setfilter

事实上,在用户选择文件并点击 OK 确认后,您不得不检查文件的正确性。

您可以对这种情况有所帮助:如果您喜欢痛苦,那么您可以从 .NET 源代码中复制整个 IFileDialog COM 互操作代码,并实现 IFileDialogEvents。这样,当用户单击“确定”时,您可以拒绝选择并在对话框关闭之前显示错误,让对话框保持打开状态,以便用户可以选择不同的文件。

如果您心智健全并且不想这样做,那么您必须在验证失败后再次打开对话框。

,

简单的方法就是使用另一个扩展名保存处理过的数据,例如“BaseFileName_Processed_20105640640.cvs1”,这样您就可以保留数据并且您的文件对话框不会显示此文件。

另一种方法是在 if 语句中调用 OpenFileDialog()(并将返回值与 DialogResult.OK 进行比较),然后将文件名拆分为 {'_','.'},然后运行一个循环来计数单词 Processed(>0) 的出现,并且可能作为安全检查来确定时间戳是否存在于拆分字符串之一中。最后,在选择错误的文件时重新加载在同一个文件夹中的文件率。