Path.Combine()行为与驱动器号

Pet*_*lop 12 c#

根据有关Path.Combine方法的官方文档:https://msdn.microsoft.com/en-us/library/fyy7a5kt(v = vs.110).aspx

备注

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

这意味着它不会\在驱动器号之后添加,所以这段代码:

var path1 = @"c:";
var path2 = @"file.txt";
Path.Combine(path1, path2);
Run Code Online (Sandbox Code Playgroud)

将产生C:file.txt哪些不会强制指向file.txt放入的文件c:.

这背后的原因是什么?

Kev*_*sse 15

Path.Combine这样做是因为c:file.txt它实际上是一个有效的路径.

根据有关NTFS路径的Microsoft文档:

如果文件名仅以磁盘指示符开头但不以冒号后面的反斜杠开头,则会将其解释为指定字母的驱动器上当前目录的相对路径.请注意,当前目录可能是也可能不是根目录,具体取决于在该磁盘上最近的"更改目录"操作期间设置的目录.

简而言之,c:file.txt将在C:驱动器的当前目录中c:\file.txt搜索文件,同时将搜索驱动器根文件夹中的文件(忽略当前目录).

由于Path.Combine无法知道您期望的行为是什么,因此无法自动添加反斜杠.

  • Retrocomputing 注意:这些每个驱动器的当前目录是 DOS 2.0 遗留下来的,Win32 不再有它们并且 cmd.exe 模拟它们。参见[Raymond Chen:为什么每个驱动器都有自己的当前目录?](https://blogs.msdn.microsoft.com/oldnewthing/20101011-00/?p=12563) (3认同)
  • @Heinzi 那篇“旧的新事物”文章现在已移至 https://devblogs.microsoft.com/oldnewthing/20101011-00/?p=12563 (你不喜欢 https://en.wikipedia.org/wiki /链接_rot) (2认同)

ja7*_*a72 5

路径c:c:\不一样。

  • c:是驱动器规范,操作系统会在需要时附加当前文件夹。

  • c:\是驱动器的根文件夹,如c:+\