В C#, как я комбинирую больше чем две части пути к файлу сразу?

Для объединения двух частей пути к файлу можно сделать

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

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

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

Существует ли простой способ сделать это?

28
задан Matthew 27 March 2011 в 19:08
поделиться

4 ответа

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

Но возрадуйтесь - в .NET 4.0 есть эта перегрузка :

public static string Combine(
    params string[] paths
)

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

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

24
ответ дан 28 November 2019 в 02:54
поделиться

Вот утилита, которую можно использовать:

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);
31
ответ дан 28 November 2019 в 02:54
поделиться

Нет - вам нужно вызвать 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
ответ дан 28 November 2019 в 02:54
поделиться

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

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));
}
4
ответ дан 28 November 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: