我如何使用System.Uri错误& MakeRelativeUri(..)方法?

时间:2011-10-19 06:25:50

标签: c# .net frameworks

更新

我将缺少的两个变量添加到了回购代码 blush 真诚地对此有所了解 - 当我快速审阅帖子时,我正急着去接孩子并错过了。


当我调用.NET框架的MakeRelativeUri(...)方法并在包含文件路径的Uri中传递..并且文件路径中包含空格时...那么Force中存在很大的干扰,就好像数以百万计的声音突然在恐怖中大声喊叫,突然沉默了。

这是我的回购代码。对此的应用是MSTest回购,而不是像NUnit或XUnit那样更好的东西。

[TestMethod]
public void SadPanda()
{
    // Arrange.
    var outputPath =
        @"C:\Users\AAAAAAA.BBBBB\Documents\Visual Studio 2010\Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\___sa.bundle.#.css";

    var sourcePath =
        @"C:\Users\AAAAAAA.BBBBB\Documents\Visual Studio 2010\Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\home.css";
    var sourcePathJussy =
        @"C:\Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\home.css";

    // Added missing 2x vars *blush*    
    var sourceUri = new Uri(Path.GetDirectoryName(sourcePath) + "/", UriKind.Absolute);
    var outputUri = new Uri(Path.GetDirectoryName(outputPath) + "/", UriKind.Absolute);

    var relativePath = "../images/home-feature-bg.png";
    var resolvedSourcePath = new Uri(sourceUri + relativePath, true);

    // Act. 
    var resolvedOutput = outputUri.MakeRelativeUri(resolvedSourcePath);     

    // Assert.
    Assert.IsTrue(resolvedOutput.Contains("XWing")); // :~(
}

现在,如果你看一下输出,那么这个位置的真实路径是邪恶的。

现在,如果我们从路径中删除SPACES,它现在可以工作:)

[TestMethod]
public void DoubleRaindbowUnicorns()
{
    // Arrange.
    var outputPath =
        @"C:\Users\AAAAAAA.BBBBB\Documents\Visual Studio 2010\Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\___sa.bundle.#.css";

    var sourcePath =
        @"C:\Users\AAAAAAA.BBBBB\Documents\Visual Studio 2010\Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\home.css";
    var sourcePathJussy =
        @"C:\Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\home.css";

    outputPath = outputPath.Replace(" ", "-");
    sourcePath = sourcePath.Replace(" ", "-");

    // Added missing 2x vars *blush*
    var sourceUri = new Uri(Path.GetDirectoryName(sourcePath) + "/", UriKind.Absolute);
    var outputUri = new Uri(Path.GetDirectoryName(outputPath) + "/", UriKind.Absolute);

    var relativePath = "../images/home-feature-bg.png";
    var resolvedSourcePath = new Uri(sourceUri + relativePath, true);

    // Act. 
    var resolvedOutput = outputUri.MakeRelativeUri(resolvedSourcePath);     

    // Assert.
    Assert.IsFalse(resolvedOutput.Contains("XWing")); // Here yee! Woot, say I!
}

此图像资源的输出为../images/home-feature-bg.png(由fluke与其源路径相同)..而不是真正长的邪恶字符串。

是/否?

更新2:

重命名主题(以更好地反映答案)。

3 个答案:

答案 0 :(得分:4)

您需要使用System.IO.Path.Combine()功能。这里发生的是你使用的URI类不能包含空格,如果它是HTML的路径,则需要%20

答案 1 :(得分:3)

我认为你误解了MakeRelativeUri()功能的目的。应该在一个绝对URI上调用另一个URI,以便返回相对URI,该URI表示如何在第一个资源的上下文中到达第二个资源。

示例:

var cssFileUri = new Uri(@"C:\Temp\Spaces in this path\foo.css");
var imageFileUri = new Uri(@"C:\Temp\Images\bar.png");

var relativeUri = cssFileUri.MakeRelative(imageFileUri);
// The value of relativeUri is "../Images/bar.png"

因此,您可以看到relativeUri值如何从“foo.css”获取“bar.png”文件。

在您的示例中,您将传递CSS文件路径和图像路径,以获取relativePath中的值。

为了“撤消”(找到与给定CSS文件相关的图像的完整路径),您构造了一个新的Uri对象:

var relativeImageUri = @"..\Image Folder\bar.png";
var cssFileUri = new Uri(@"C:\Some Path\Other Folder\foo.css");

var absoluteImageUri = new Uri(cssFileUri, relativeImageUri);
// The value of absoluteImageUri is "file:///C:/Some Path/Image Folder/bar.png"

因此,为了从示例代码中找到resolvedOutput

var outputPath =  @"C:\Users\AAAAAAA.BBBBB\Documents\Visual Studio 2010 Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\___sa.bundle.#.css";

var sourcePath = @"C:\Users\AAAAAAA.BBBBB\Documents\Visual Studio 2010\Projects\XWing\Code\CCCCCCCCCCC.XWing.Application.Web\content\shared\css\home.css";

var relativePath = "../images/home-feature-bg.png";

var outputUriBase = new Uri(outputPath);
var resolvedOutput = new Uri(outputUriBase, relativePath);

您现在可以使用resolvedOutput Uri对象访问相对于输出路径的“home-feature-bg.png”图像。

所有这些都会在路径中处理空格而不会出错。

答案 2 :(得分:0)

uriInstance.MakeRelativeUri() 

方法似乎已损坏。生成的Uri将在使用ToString()调用时显示转义字符,例如%20表示空白区域。其他Uri实例不这样做,甚至不是相对的。

我想通过从完整路径中减去根路径来创建相对路径,然后将数据库中的字符串存储在数据库中

var baseUri = new Uri("http://myserver/pics")
var fullUri = new Uri("http://myserver/pics/myself/smile a.jpg")

var madeRelativeUri = baseUri.MakeRelativeUri(fullUri)

  // madeRelativeUri.ToString() = "myself/smile%20a.jpg"

var manualRelativeUri = new Uri(@"myself/smile b", UriKind.Relative)

  // manualRelativeUri.ToString() = "myself/smile b.jpg" // no escape