Для объединения двух частей пути к файлу можно сделать
System.IO.Path.Combine (path1, path2);
Однако Вы не можете сделать
System.IO.Path.Combine (path1, path2, path3);
Существует ли простой способ сделать это?
Как говорили другие, в .NET 3.5 и ранее В версиях не было способа сделать это аккуратно - вам нужно либо написать свой собственный метод Combine
, либо вызвать Path.Combine
несколько раз.
Но возрадуйтесь - в .NET 4.0 есть эта перегрузка :
public static string Combine(
params string[] paths
)
Есть также перегрузки, занимающие 3 или 4 строки, предположительно, чтобы не создавать массив без необходимости общие случаи.
Надеюсь, Mono скоро перенесет эти перегрузки - я уверен, что их будет легко реализовать и они будут очень благодарны.
Вот утилита, которую можно использовать:
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));
}
Альтернативная кодовая версия для гольфа (более короткая, но не совсем понятная, семантика немного отличается от Path.Combine
):
public static string CombinePaths(params string[] paths)
{
if (paths == null)
{
throw new ArgumentNullException("paths");
}
return paths.Aggregate(Path.Combine);
}
Тогда можно назвать это как:
string path = CombinePaths(path1, path2, path3);
Нет - вам нужно вызвать Path.Combine ()
несколько раз.
Вы могли бы написать вспомогательный метод, который сделает это за вас:
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;
}
Не просто, но умно :)
string str1 = "aaa", str2 = "bbb", str3 = "ccc";
string comb = new string[] { str1, str2, str3 }
.Aggregate((x, y) => System.IO.Path.Combine(x, y));
Или:
string CombinePaths(params string[] paths)
{
return paths.Aggregate((x,y) => System.IO.Path.Combine(x, y));
}