如何从另一个路径中删除部分路径?

3

我有两个文件路径,如下所示:

var path1 = "c:\dir\anotherdir";
var path2 = "c:\dir\anotherdir\yetanotherdir\dirception\file.zip";
var result = path2 - path1; //Wanted result: yetanotherdir\dirception\file.zip

我需要做的是从路径2中“删除”路径1。
最简单的解决方案是使用substr或其他方法,以“文本”方式从路径2中剪切出路径1。但我更愿意使用一些实际内置的C#函数来处理路径。
我尝试了这个:
var result = (new Uri(path1)).MakeRelativeUri(path2);

期望结果:yetanotherdir\dirception\file.zip

实际结果:anotherdir\yetanotherdir\dirception\file.zip

那么如何最好地达到我的目标呢?


注:该内容为关于IT技术的问题,涉及文件路径。

1
这两个路径实际上是字符串吗?如果是,您可以直接使用string.Replace方法。 - Ivan Zub
是的,它们是字符串,但正如我所说,我宁愿不使用简单的文本替换,而是使用一些内置函数来处理路径,以提高可靠性。 - Userman
4个回答

4

Path.GetFullPathString.StartsWithString.Substring 应该足够可靠:

string path1 = @"c:\dir\anotherdir";
string path2 = @"c:\dir\anotherdir\yetanotherdir\dirception\file.zip";
string fullPath1 = Path.GetFullPath(path1);
string fullPath2 = Path.GetFullPath(path2);
if (fullPath2.StartsWith(fullPath1, StringComparison.CurrentCultureIgnoreCase))
{
    string result = fullPath2.Substring(fullPath1.Length).TrimStart(Path.DirectorySeparatorChar);
    // yetanotherdir\dirception\file.zip
}

TrimStart ... 嗯嗯嗯嗯嗯 ... :) - Noctis
@Noctis:这有什么问题吗?如果存在,这是一种可靠的方法来从路径开头删除目录分隔符。我不知道 OP 为什么需要删除它,但这是另一个问题了。他可以跳过 TrimStart,我只是想给他想要的结果。 - Tim Schmelter
没有任何问题,相反地 :) 我唯一会做不同的事情,可能是将 .TrimStart 换到下一行,并与 .Substring 对齐。 - Noctis

1

你可以直接替换它

var result = path2.Replace(path1+"/","");

这会留下一个额外的反斜杠。 - Sayse
@Sayse 什么??它是一个空字符串。 - Amit Joki
var path2 = "c:\dir\anotherdir.."(不是我的设备) - Sayse

0
var path1 = @"c:\dir\anotherdir";
var path2 = @"c:\dir\anotherdir\yetanotherdir\dirception\file.zip";
var path3 = path2.Replace(path1,""); // Will hold : \yetanotherdir\dirception\file.zip

如果你希望的话,可以删除第一个 \。但是出于好奇,为什么你不想要路径前缀呢?


例如,如果path1@"c:\dir\Anotherdir\",甚至不用说如果path1是在path2中多次出现的相对路径,那么它就会失败。 - Tim Schmelter
  1. 再次强调,对于他所举的例子应该能够正常工作,如果他有大小写目录,则这两个目录实际上并不相同。
  2. 如果路径开头是 c:\ 的话,我怀疑这种情况不会发生,但也无妨。
- Noctis
尝试创建一个名为Test的目录,以及在同一文件夹中名为test的另一个目录。根据第二点,相对路径从不以根目录开头,这使它们成为相对路径。 - Tim Schmelter

0
如果您在path1的末尾添加一个额外的路径分隔符,则变成:
var path1 = "c:\dir\anotherdir\";

那么以下代码应该可以正常工作:

var result = (new Uri(path1)).MakeRelativeUri(new Uri(path2));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接