1

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

这是最基本的重载:

    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 (*.*)|*.*";
    }
}

但我知道这与我编写初始方法的方式不符。任何人有任何建议或知道已经有类似内容的库吗?

4

2 回答 2

3

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

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");
于 2013-10-25T19:13:26.670 回答
0

您想为要传递给打开文件对话框的所有过滤器构建字符串。在名为FilterBuilder的库中有一个这样做的例子。本文包含源代码和库中已有的 100 多种流行文件类型。

此外,构建过滤器字符串的语法是调用FilterBuilder对象的Add()方法。Reed 的解决方案会起作用,但对于文件类型数量变大的场景会变得很麻烦,因为每种类型都是BuildFilterString()方法的参数。

于 2013-10-25T19:19:37.403 回答