在Visual Studio的即时窗口中:

> Path.Combine(@"C:\x", "y")
"C:\\x\\y"
> Path.Combine(@"C:\x", @"\y")
"\\y"

看来它们应该是一样的。

旧的FileSystemObject.BuildPath()不是这样工作的……


当前回答

如果你想在不丢失任何路径的情况下组合这两条路径,你可以使用这个:

?Path.Combine(@"C:\test", @"\test".Substring(0, 1) == @"\" ? @"\test".Substring(1, @"\test".Length - 1) : @"\test");

或者用变量:

string Path1 = @"C:\Test";
string Path2 = @"\test";
string FullPath = Path.Combine(Path1, Path2.IsRooted() ? Path2.Substring(1, Path2.Length - 1) : Path2);

这两种情况都返回“C:\test\test”。

首先,我计算Path2是否以/开头,如果为真,返回不带第一个字符的Path2。否则,返回完整的Path2。

其他回答

由于不知道实际的细节,我猜测它尝试像连接相对uri那样连接。例如:

urljoin('/some/abs/path', '../other') = '/some/abs/other'

这意味着当您使用前面的斜杠连接路径时,实际上是将一个基底连接到另一个基底,在这种情况下,第二个基底优先。

正如Ryan所提到的,它正在做文档中所说的事情。

根据DOS时间,区分当前磁盘和当前路径。 \是根路径,但用于当前磁盘。

对于每个“磁盘”都有一个单独的“当前路径”。 如果您使用cd D:更改磁盘,则不会将当前路径更改为D:\,而是更改为:“D:\whatever\was\the\last\path\access \on\this\disk”…

因此,在windows中,文字@“\x”意味着:“CURRENTDISK:\x”。 因此路径。Combine(@"C:\x", @"\y")的第二个参数是根路径,不是相对路径,虽然不在已知磁盘中… 由于不知道哪个可能是«当前磁盘»,python返回“\\y”。

>cd C:
>cd \mydironC\apath
>cd D:
>cd \mydironD\bpath
>cd C:
>cd
>C:\mydironC\apath

这个\表示“当前驱动器的根目录”。在你的例子中,它指的是当前驱动器根目录中的“test”文件夹。所以,这可以等于"c:\test"。

原因:

第二个URL被认为是一个绝对路径,如果最后一个路径是一个绝对路径,Combine方法只会返回最后一个路径。

解决方案:

只需从第二个路径(/SecondPath到SecondPath)中删除前导斜杠/,它就会正常工作。

删除Path.Combine的第二个参数(path2)中的起始斜杠('\')。