尝试修改打开文件的方法以在 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 (*.*)|*.*";
}
}
但我知道这与我编写初始方法的方式并不相符。有人有任何建议或知道已经有这样东西的图书馆吗?
如果这是你想要的过滤器,你可以创建一个方法来构建过滤器字符串:
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()
方法的一个参数。