C# 的 Path.GetDirectoryName 与 Python 的 os.path.split
2009年8月11日
C# 的 Path.GetDirectoryName 与 Python 的 os.path.split
大青蛙
为了答谢广大中国程序员对本人的厚爱,本文使用中文撰写,谢谢。我不叫周立波,我只认识张立波。
最近使用 C# 编一个程序,发现它的 Path.GetDirectoryName 的行为与 Python 的 os.path.split 不完全一样。主要的区别在于,当输入是根目录时,Path.GetDirectoryName 会返回 null,而 Python 的 os.path.split 会返回一个元组(蛋糕),内容是 (根目录, 空串)。当我静下心来仔细想到底哪个更正确时,发现各有各的道理:.NET 的 Path.GetDirectoryName 的意思是:我死命地要返回你所给我的路径的上层目录;如果已经是根目录了,那么没办法,返回 null 吧。而 os.path.split 的意思是:我要把路径分割成目录和文件名两部分。既然左边的必须是目录,那么遇到像 C:\ 这样的根目录,我总不能直接扔掉吧,但也不能当作文件名放在返回的那个元组的右边吧。于是,还是原封不动地放在返回值的左边算了。
类似的,Path.Combine 与 Python 的 os.path.join 也有着区别。对于 Path.Combine("C:\\abc", "") 这样的调用,返回的就是 C:\abc,没有任何操作。它的意思是:如果你给我的文件名是空串,那么我就什么都不做。如果给的目录名是 C:\abc\,它也会原封不动地返回 C:\abc\。而 os.path.join 则是 simple and stupid(简单又直白)了,对于文件名是空和非空一样处理。比如目录名是 C:\abc,文件名是空串,那么它还是会返回 C:\abc\,这与文件名是非空串时类似,比如 C:\abc 和文件名 d,它会返回 C:\abc\d。可见去掉文件名之后的情形就是空串的情形。