В С#, как мне объединить более двух частей пути к файлу сразу?

Чтобы объединить две части пути к файлу, вы можете сделать

System.IO.Path.Combine (path1, path2);

Однако вы не можете сделать

System.IO.Path.Combine (path1, path2, path3);

Есть ли простой способ сделать это?

Ответ 1

Как говорили другие, в .NET 3.5 и более ранних версиях не было возможности сделать это аккуратно - вам либо нужно написать свой собственный метод Combine, либо вызвать Path.Combine несколько раз.

Но rejoice - для .NET 4.0 существует эта перегрузка:

public static string Combine(
    params string[] paths
)

Существуют также перегрузки с 3 или 4 строками, предположительно так, что для обычных случаев нет необходимости создавать массив.

Мы надеемся, что Mono скоро перенесет эти перегрузки - я уверен, что их будет легко реализовать и высоко ценят.

Ответ 2

Здесь вы можете использовать утилиту:

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);

Ответ 3

Нет - вы должны называть 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;
}

Ответ 4

Не простой, но умный:)

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));
}

Ответ 5

С перегрузкой метода, введенной в .NET 4 Path.Combine(string [])

Path.Combine(new [] { "abc", "def", "ghi", "jkl", "mno" });