【问题标题】:C# OpenFileDialog multiple filename filters including excludeC# OpenFileDialog 多个文件名过滤器,包括排除
【发布时间】:2021-05-02 12:51:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 没有。相反,将处理过的文件移动到另一个文件夹中。

标签: c# .net openfiledialog


【解决方案1】:

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

根据 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。这样,当用户单击“确定”时,您可以拒绝选择并在对话框关闭之前显示错误,让对话框保持打开状态,以便用户可以选择不同的文件。

如果您是理智的并且不想这样做,那么您将不得不在验证失败后再次打开对话框。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • .csv1 实际上并没有阻止它们出现。短名称支持将其转换为与过滤器匹配的 BaseFil~.csv。
    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多