如果我有很多目录名称作为文字字符串或包含在变量中,那么将它们组合成完整路径的最简单方法是什么?
我知道
路径组合但这仅需要 2 个字符串参数,我需要一个可以采用任意数量的目录参数的解决方案。
例如:
字符串文件夹1 =“foo”; 字符串文件夹2 =“酒吧”; CreateAPath("C:", folder1, folder2, folder1, folder1, folder2, "MyFile.txt")
有任何想法吗?C# 是否支持方法中的无限参数?
如果我有很多目录名称作为文字字符串或包含在变量中,那么将它们组合成完整路径的最简单方法是什么?
我知道
路径组合但这仅需要 2 个字符串参数,我需要一个可以采用任意数量的目录参数的解决方案。
例如:
字符串文件夹1 =“foo”; 字符串文件夹2 =“酒吧”; CreateAPath("C:", folder1, folder2, folder1, folder1, folder2, "MyFile.txt")
有任何想法吗?C# 是否支持方法中的无限参数?
C# 是否支持方法中的无限参数?
是的,看看 params 关键字。可以很容易地编写一个只调用 Path.Combine 适当次数的函数,如下所示(未经测试):
string CombinePaths(params string[] parts) {
string result = String.Empty;
foreach (string s in parts) {
result = Path.Combine(result, s);
}
return result;
}
LINQ 再次进行救援。聚合扩展功能可用于完成您想要的。考虑这个例子:
string[] ary = new string[] { "c:\\", "Windows", "System" };
string path = ary.Aggregate((aggregation, val) => Path.Combine(aggregation, val));
Console.WriteLine(path); //outputs c:\Windows\System
与 Directory 上的静态方法相比,我更喜欢使用 DirectoryInfo,因为我认为它是更好的 OO 设计。这是一个使用 DirectoryInfo + 扩展方法的解决方案,我认为它非常好用:
public static DirectoryInfo Subdirectory(this DirectoryInfo self, params string[] subdirectoryName)
{
Array.ForEach(
subdirectoryName,
sn => self = new DirectoryInfo(Path.Combine(self.FullName, sn))
);
return self;
}
我不喜欢我正在修改的事实self
,但是对于这个简短的方法,我认为它比创建一个新变量更干净。
不过,呼叫站点弥补了这一点:
DirectoryInfo di = new DirectoryInfo("C:\\")
.Subdirectory("Windows")
.Subdirectory("System32");
DirectoryInfo di2 = new DirectoryInfo("C:\\")
.Subdirectory("Windows", "System32");
添加获取 FileInfo 的方法留作练习(对于另一个 SO 问题!)。
试试这个:
public static string CreateDirectoryName(string fileName, params string[] folders)
{
if(folders == null || folders.Length <= 0)
{
return fileName;
}
string directory = string.Empty;
foreach(string folder in folders)
{
directory = System.IO.Path.Combine(directory, folder);
}
directory = System.IO.Path.Combine(directory, fileName);
return directory;
}
参数使您可以附加无限数量的字符串。
Path.Combine 的作用是确保输入的字符串不以斜杠开头或结尾,并检查任何无效字符。