尝试修改打开文件的方法以在 C# 中打开特定的文件扩展名

本文关键字:文件 扩展名 方法 修改 | 更新日期: 2023-09-27 18:36:52

我有一个方法,我一遍又一遍地复制来选择一个文件并返回文件名,我厌倦了根据具体情况修改它,所以我决定继续为它编写一些重载,这将涵盖我使用它的大部分方式。

这是最基本的重载:

    public void OpenFiles(out string path)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == DialogResult.OK)
            path = ofd.FileName;
        else
            path = null;
        return;
    }
有时,我想指定一个文件扩展名

或一组文件扩展名,起初我打算为每种文件类型编写一个单独的重载,但我想写一些更通用的东西,有人可以使用该方法并在重载中选择一个或多个扩展名,这将限制他们可以打开的文件。

起初我开始写这样的重载:

    public void OpenFiles(string filter, out string path)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = filter;
        if (ofd.ShowDialog() == DialogResult.OK)
            path = ofd.FileName;
        else
            path = null;
    }

但这不是我想要的效果。然后我想写一个这样的扩展方法:

public class Filters
{
    public string fileExtFilter(this ReturnFilePaths filePath, string filetype)
    {
        string txtFilter = "txt files (*.txt)|*.txt";
        string csvFilter = "csv files (*.csv)|*.csv";
        string xlsxFilter = "xlsx files (*.xlsx)|*.xlsx";
        string xlsFilter = "xls files (*.xls)|*.xls";
        if (filetype == "csv")
            return csvFilter;
        else if (filetype == "txt")
            return txtFilter;
        else if (filetype == "xlsx")
            return xlsxFilter;
        else if (filetype == "xls")
            return xlsFilter;
        else
            return "All files (*.*)|*.*";
    }
}

但我知道这与我编写初始方法的方式并不相符。有人有任何建议或知道已经有这样东西的图书馆吗?

尝试修改打开文件的方法以在 C# 中打开特定的文件扩展名

如果这是你想要的过滤器,你可以创建一个方法来构建过滤器字符串:

public string BuildFilterString(bool includeAllFiles, params string[] extensions)
{
    var filters = extensions.Select(ex => string.Format("{0} files (*.{0})|*.{0}", ex)); 
    string result = string.Join("|", filters);
    if (includeAllFiles)
    {
        result += result == string.Empty ? "All files (*.*)|*.*" : "|All files (*.*)|*.*";
    }
    return result;
}

然后,您可以通过以下方式构建过滤器:

filter = BuildFilterString(true, "csv", "xls", "xlsx");

您希望为要传递给打开文件对话框的所有筛选器构建字符串。在一个名为 FilterBuilder 的库中有一个做这样的事情的例子。本文的源代码和库中已有100 +流行的文件类型。

此外,用于生成筛选器字符串的语法是对FilterBuilder对象的 Add() 方法的调用。Reed 的解决方案将起作用,但对于文件类型数量变大的情况会变得很麻烦,因为每种类型都是 BuildFilterString() 方法的一个参数。