从C#中的组件构建目录字符串
时间:2020-03-06 14:49:53 来源:igfitidea点击:
如果我有很多目录名称(如文字字符串或者包含在变量中),将它们组合成完整路径的最简单方法是什么?
我知道
Path.Combine
但这只需要2个字符串参数,我需要一个可以接受任意数量的目录参数的解决方案。
例如:
string folder1 = "foo"; string folder2 = "bar"; CreateAPath("C:", folder1, folder2, folder1, folder1, folder2, "MyFile.txt")
有任何想法吗?
C是否支持方法中的无限参数?
解决方案
Does C# support unlimited args in methods?
是的,看看params关键字。将使编写仅调用Path.Combine适当次数的函数变得容易,像这样(未经测试):
string CombinePaths(params string[] parts) { string result = String.Empty; foreach (string s in parts) { result = Path.Combine(result, s); } return result; }
试试这个:
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要做的是确保输入的字符串不以斜杠开头或者结尾,并检查任何无效字符。
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问题!)。