我将缺少的两个变量添加到了回购代码 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与其源路径相同)..而不是真正长的邪恶字符串。
是/否?
重命名主题(以更好地反映答案)。
答案 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