簡體   English   中英

在 C# 中,如何一次組合文件路徑的兩個以上部分?

[英]In C#, how do I combine more than two parts of a file path at once?

要組合文件路徑的兩個部分,您可以執行

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

然而,你不能這樣做

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

有沒有一種簡單的方法可以做到這一點?

這是您可以使用的實用方法:

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

正如其他人所說,在 .NET 3.5 和更早版本中,沒有辦法巧妙地做到這一點 - 您要么必須編寫自己的Combine方法, Path.Combine多次調用Path.Combine

但是要慶幸——因為在 .NET 4.0 中,有 這樣的重載

public static string Combine(
    params string[] paths
)

也有采用 3 或 4 個字符串的重載,大概是為了不需要為常見情況創建不必要的數組。

希望 Mono 能盡快移植這些重載——我相信它們會很容易實現並且非常感謝。

不簡單,但很聰明:)

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

編輯Order23 的答案實際上是最新的與當前的 .NET https://stackoverflow.com/a/41148772/235648

不 - 你必須多次調用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;
}

隨着 .NET 4 Path.Combine(string [])引入的方法重載

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM