下面代码执行的结果一样么?
Console.WriteLine(Path.Combine("d://projects", "//20090716//11"));
Console.WriteLine(Path.Combine("d://projects", "/20090716/11")); Console.WriteLine(Path.Combine("d://projects", "20090716//11"));
答案是不一样的,执行的结果分别是:
/20090716/11
/20090716/11
d:/projects/20090716/11
为何会这样呢??
MSDN 中文上的解释如下,红色字体是导致这个问题的根本原因:
如果 path2 不包括根(例如,如果 path2 没有以分隔符或驱动器规格起始),则结果是两个路径的串联,具有介于其间的分隔符。如果 path2 包括根,则返回 path2。
MSDN 英文的解释如下:
If path2 does not include a root (for example, if path2 does not start with a separator character or a drive specification), the result is a concatenation of the two paths, with an intervening separator character. If path2 includes a root, path2 is returned.
显然,除了 除了驱动器开头的路径会认为是根, / 或者 / 开头的也被认为是根,所以才有上面的计算结果
比如: //myserver/myshare/foo/bar/baz.txt 这个路径中, 我们就可以看到 / 确实有必要作为根路径
在这里 / 或者 / 被等同处理,是因为各个操作系统上确实用的不一样。如下:
Path.DirectorySeparatorChar 字段
提供平台特定的字符,该字符用于在反映分层文件系统组织的路径字符串中分隔目录级别。
该字段的值在 Unix 上为斜杠(“/”),在 Windows 和 Macintosh 操作系统上为反斜杠(“/”)。
Path.AltDirectorySeparatorChar 字段
提供平台特定的替换字符,该替换字符用于在反映分层文件系统组织的路径字符串中分隔目录级别。
该字段的值在 Unix 上为反斜杠(“/”),在 Windows 和 Macintosh 操作系统上为斜杠(“/”)。
Path.VolumeSeparatorChar 字段
提供平台特定的卷分隔符。
该字段的值在 Windows 和 Macintosh 上为冒号(“:”),在 Unix 操作系统上为斜杠(“/”)。
参考资料:
Path.Combine 方法
http://msdn.microsoft.com/zh-cn/library/fyy7a5kt.aspx
http://msdn.microsoft.com/en-us/library/fyy7a5kt.aspx
Path.Combine (合并两个路径字符串)方法的一些使用细节
http://blog.joycode.com/ghj/archive/2006/08/07/79611.joy