Reputation: 29216
To combine two parts of a file path, you can do
System.IO.Path.Combine (path1, path2);
However, you can't do
System.IO.Path.Combine (path1, path2, path3);
Is there a simple way to do this?
Upvotes: 34
Views: 19423
Reputation: 32639
Not simple, but clever :)
string str1 = "aaa", str2 = "bbb", str3 = "ccc";
string comb = new string[] { str1, str2, str3 }
.Aggregate((x, y) => System.IO.Path.Combine(x, y));
Or:
string CombinePaths(params string[] paths)
{
return paths.Aggregate((x,y) => System.IO.Path.Combine(x, y));
}
EDIT Order23's answer is actually up to date with current .NET https://stackoverflow.com/a/41148772/235648
Upvotes: 5
Reputation: 71
With the method overload introduced in .NET 4 Path.Combine(string [])
Path.Combine(new [] { "abc", "def", "ghi", "jkl", "mno" });
Upvotes: 2
Reputation: 122654
Here's a utility method you can use:
public static string CombinePaths(string path1, params string[] paths)
{
if (path1 == null)
{
throw new ArgumentNullException("path1");
}
if (paths == null)
{
throw new ArgumentNullException("paths");
}
return paths.Aggregate(path1, (acc, p) => Path.Combine(acc, p));
}
Alternate code-golf version (shorter, but not quite as clear, semantics are a bit different from Path.Combine
):
public static string CombinePaths(params string[] paths)
{
if (paths == null)
{
throw new ArgumentNullException("paths");
}
return paths.Aggregate(Path.Combine);
}
Then you can call this as:
string path = CombinePaths(path1, path2, path3);
Upvotes: 36
Reputation: 1501896
As others have said, in .NET 3.5 and earlier versions there hasn't been a way to do this neatly - you either have to write your own Combine
method or call Path.Combine
multiple times.
But rejoice - for in .NET 4.0, there is this overload:
public static string Combine(
params string[] paths
)
There are also overloads taking 3 or 4 strings, presumably so that it doesn't need to create an array unnecessarily for common cases.
Hopefully Mono will port those overloads soon - I'm sure they'd be easy to implement and much appreciated.
Upvotes: 30
Reputation: 25704
Nope - you have to call Path.Combine()
several times.
You could write a helper method that does it for you, though:
public static string CombinePaths(params string[] paths) {
if (paths == null) {
return null;
}
string currentPath = paths[0];
for (int i = 1; i < paths.Length; i++) {
currentPath = Path.Combine(currentPath, paths[i]);
}
return currentPath;
}
Upvotes: 4