用C#组合两个相对路径

时间:2014-09-07 13:04:04

标签: c# mono

有很多用于“追加绝对路径的相对路径”,但我需要相对于亲戚添加。

e.g:

Path1 = "Parent/Child/a.txt"
Path2 = "../Sibling/file.cs"

Result = "Parent/Sibling/file.cs"

尝试:

  • Directory.GetParent() - 有效,但我找不到返回结果的方法(它只能返回绝对路径)
  • Path.Combine() - 仅适用于简单案例和绝对路径。使用相对路径的“..”失败(严重!)

...编写一个字符串标记化的Path类来解决这个问题似乎很荒谬,但是我一直在挖掘MSDN文档,似乎无法找到一个正确使用相对路径的工作路径/目录类

更糟糕的是......我正在努力让这项工作一直回到.NET 2(感谢Mono兼容性)

3 个答案:

答案 0 :(得分:1)

我知道下面的代码很难看但会起作用(抱歉我还没有确认单声道):

var Result =
    Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Path1), Path2))
    .Substring(Directory.GetCurrentDirectory().Length + 1); // +1 to remove leading path separator

答案 1 :(得分:0)

我不确定你为什么说Path.Combine失败,因为你没有提供任何你尝试过的例子。但Path.Combine完全符合您的要求。在这种情况下你必须给它一些帮助;你的第一个路径是文件名,你需要目录。

var filePath1 = "Parent/Child/a.txt";
var filePath2 = "../Sibling/file.cs";

var baseDirectory = Path.GetDirectoryName(filePath1);
var result = Path.Combine(baseDirectory, filePath2);

这会返回"Parent\Child\../Sibling/file.cs"而不是您要查找的"Parent/Sibling/file.cs",但这两条路径完全相同。

答案 2 :(得分:0)

我在Windows上试过它,它应该在Mac OS(Mono / Xamarin)或Linux(Mono)上运行,但你可能需要一个不同的dummyDriveLetter变量值。

    static void Main(string[] args)
    {
        string Path1 = "Parent/Child/a.txt";
        string Path2 = "../Sibling/file.cs";

        string dummyDriveLetter = "C:/"; // must be an absolute path, so let's add a dummy prefix, works on Windows
        string absolutePath1 = dummyDriveLetter + Path1;

        var path1Uri = new Uri(absolutePath1, UriKind.Absolute);
        var path2Uri = new Uri(Path2, UriKind.Relative);
        var diff = new Uri(path1Uri, path2Uri);
        string Result = diff.OriginalString.Replace(dummyDriveLetter, "");

        Console.WriteLine(Result);
    }