为什么Path.Combine不在驱动器指示符后添加Path.DirectorySeparatorChar?

Jad*_*ias 20 .net path path-combine

var actual = Path.Combine("c:", "filename");
var expected = @"c:\filename";
Assert.AreEqual(expected, actual);
Run Code Online (Sandbox Code Playgroud)

结果

{Assert.AreEqual failed. Expected:<c:\filename>. Actual:<c:filename>.
Run Code Online (Sandbox Code Playgroud)

为什么?

Pet*_*den 28

C:filename是一个有效的路径,是不同的C:\filename.C:filename是驱动器filename上当前目录中的文件,C:而是该驱动器根目录中C:\filename的文件filename.显然,他们希望保留在某些驱动器上引用当前目录的功能.

MSDN中描述此行为

  • 这是来自DOS 1.x IIRC ... ...-)的延续 (4认同)
  • 怪异......这是不直观的.获得预期价值的方法是什么?`Path.Combine(驱动器+ @"\",路径)`? (3认同)
  • @Gishu - 这只是不直观的,因为路径在Windows操作系统中运行的方式并不像人们想象的那么简单.请参阅我链接到的MSDN文章,以查找Windows路径如何工作的说明.Path.Combine()组合了两个路径.我不会以你建议的方式使用字符串连接,因为这会破坏Path.Combine()的整个目的.AFAIC您应该注意指定路径的方式.如果你的意思是"C:\"使用它,如果OTOH你的意思是"C:"(这是不同但同样有效)然后使用它. (2认同)

Gav*_*ler 5

MSDN似乎没有解释原因,但确实提供了您所看到的文档:

Path.Combine(string path1,string path2)

如果path1不是驱动器引用(即"C:"或"D:")并且不以DirectorySeparatorChar,AltDirectorySeparatorChar或VolumeSeparatorChar中定义的有效分隔符结束,则在连接之前会将DirectorySeparatorChar附加到path1.