gpt4 book ai didi

.net - 计算相对于某些根的路径-Path.Combine的逆

转载 作者:行者123 更新时间:2023-12-03 11:53:57 24 4
gpt4 key购买 nike

有可靠的方法来计算Path.Combine()的逆数吗?

Path.Combine(“c:\ folder”,“subdirectory \ something.txt”)可能返回类似“c:\ folder \ subdirectory \ something.text”的内容。我想要的是相反的函数,其中Path.GetRelativeUrl(“c:\ folder”,“c:\ folder \ subdirectory \ something.text”)将返回类似“” subdirectory \ something.txt“的函数。

一种解决方案是进行字符串比较并修剪根,但是如果以不同的方式(在路径表达式中使用“..”或“〜1”)表示相同的路径,则此方法将无效。

最佳答案

好的,所以在我的情况下,我没有一些比较困难的情况(fullPath和relativePath混合网络映射位置,超长文件名)。我最终要做的是在下面创建类

public class PathUtil
{
static public string NormalizeFilepath(string filepath)
{
string result = System.IO.Path.GetFullPath(filepath).ToLowerInvariant();

result = result.TrimEnd(new [] { '\\' });

return result;
}

public static string GetRelativePath(string rootPath, string fullPath)
{
rootPath = NormalizeFilepath(rootPath);
fullPath = NormalizeFilepath(fullPath);

if (!fullPath.StartsWith(rootPath))
throw new Exception("Could not find rootPath in fullPath when calculating relative path.");

return "." + fullPath.Substring(rootPath.Length);
}
}

看来效果很好。至少,它通过了以下NUnit测试:
[TestFixture]
public class PathUtilTest
{
[Test]
public void TestDifferencesInCapitolizationDontMatter()
{
string format1 = PathUtil.NormalizeFilepath("c:\\windows\\system32");
string format2 = PathUtil.NormalizeFilepath("c:\\WindowS\\System32");

Assert.AreEqual(format1, format2);
}

[Test]
public void TestDifferencesDueToBackstepsDontMatter()
{
string format1 = PathUtil.NormalizeFilepath("c:\\windows\\system32");
string format2 = PathUtil.NormalizeFilepath("c:\\Program Files\\..\\Windows\\System32");

Assert.AreEqual(format1, format2);
}

[Test]
public void TestDifferencesInFinalSlashDontMatter()
{
string format1 = PathUtil.NormalizeFilepath("c:\\windows\\system32");
string format2 = PathUtil.NormalizeFilepath("c:\\windows\\system32\\");

Console.WriteLine(format1);
Console.WriteLine(format2);

Assert.AreEqual(format1, format2);
}

[Test]
public void TestCanCalculateRelativePath()
{
string rootPath = "c:\\windows";
string fullPath = "c:\\windows\\system32\\wininet.dll";
string expectedResult = ".\\system32\\wininet.dll";

string result = PathUtil.GetRelativePath(rootPath, fullPath);

Assert.AreEqual(expectedResult, result);
}

[Test]
public void TestThrowsExceptionIfRootDoesntMatchFullPath()
{
string rootPath = "c:\\windows";
string fullPath = "c:\\program files\\Internet Explorer\\iexplore.exe";

try
{
PathUtil.GetRelativePath(rootPath, fullPath);
}
catch (Exception)
{
return;
}

Assert.Fail("Exception expected");
}
}

测试用例依赖于现有的某些文件。这些文件在大多数Windows安装中都很常见,但是您的工作量可能会有所不同。

关于.net - 计算相对于某些根的路径-Path.Combine的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1633028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com