我刚发现了一个看起来很奇怪的设计选择:
System.IO.Path.GetDirectoryName(@"C:\folder\file.ext")
返回“C:\文件夹”
但
System.IO.Path.GetDirectoryName(@"C:\")
返回null。
如果第一个示例返回“文件夹”,我可以更好地理解它。
有什么想法吗,,为什么是这样的?当你只想得到文件夹路径时,你会做什么?
发布于 2018-04-17 20:52:46
好吧,我知道这个问题已经好几年没提过了,但是没有人真正回答‘为什么是这种情况?’,所以我要对这个问题做一个长篇大论的回答。
仅就这一解释而言,路径对于Windows来说是一种概念性的东西。出于实际目的,只有两种类型的路径。
我故意忽略相对路径,因为所有相对路径都可以转换成一个完整的路径,这是上述两条路径之一。
考虑以下代码:
var examplePaths = new[]
{
"C:\\Folder\\File.ext",
"C:\\Folder\\",
"C:\\Folder",
"C:\\",
"C:",
"\\\\Server\\Share\\Folder\\File.ext",
"\\\\Server\\Share\\Folder\\",
"\\\\Server\\Share\\Folder",
"\\\\Server\\Share\\",
"\\\\Server\\Share",
"\\\\Server\\",
"\\\\Server",
"\\\\",
};
foreach(var path in examplePaths)
{
var result = Path.GetDirectoryName(path) ?? "NULL";
Console.WriteLine($"'{path}'\t'{result}'");
}
如果你运行这个,我认为,一个有趣的模式:
C:\Folder\File.ext C:\Folder
C:\Folder\ C:\Folder
C:\Folder C:\
C:\ NULL
C: NULL
\\Server\Share\Folder\File.ext \\Server\Share\Folder
\\Server\Share\Folder\ \\Server\Share\Folder
\\Server\Share\Folder \\Server\Share
\\Server\Share\ \\Server\Share
\\Server\Share NULL
\\Server\ NULL
\\Server NULL
\\ NULL
让我们从概念上谈一条路径是什么。首先,向左一直走,就是路径根。C:\是根。服务器\共享是根用户。(看看GetRootLength源代码,看看它是如何确定路径的哪一部分是根的。)
查看上面的表,我们看到返回null的所有内容要么本身就是根路径,要么不是根路径。
我们可以在概念上把事情规划出来:
C:\Folder\File.ext Root\Directory\Filename
C:\Folder\ Root\Directory\
C:\Folder Root\Directory
C:\ Root\
C: Root
\\Server\Share\Folder\File.ext Root\Directory\Filename
\\Server\Share\Folder\ Root\Directory\
\\Server\Share\Folder Root\Directory
\\Server\Share\ Root\
\\Server\Share Root
\\Server\ Root
\\Server Root
\\ Root
我得到的是C:和\Server\Share都是根。而\Server\Share中的'\‘字符对该根具有特殊的意义。你不能天真地把最后一个“\”角色剩下的东西还回去。
如果您查看GetDirectoryName源,您可以看到,通过要求变量i大于根长度,可以看到它们考虑到了这一点。
while (i > root && path[--i] != DirectorySeparatorChar && path[i] != AltDirectorySeparatorChar);
因此,如果您传递这个函数,一个像'C:\‘这样的路径参数本身就是一个根。
现在,也许它不是最好的函数名,但是GetDirectoryName可能被合理地认为是‘获取包含该文件(或目录)的目录’,当您这样想它时,它突然变得有意义了。也许GetParentDirectory会是个更好的名字。
获取包含C:\Folder\file.ext的目录,明显的结果是C:\文件夹。
获取包含C:\文件夹的目录,结果是C:\ contains文件夹上的根目录。
获取包含C:\的目录,答案必须为NULL/nothing,因为根目录没有父目录。
发布于 2009-11-04 07:47:01
来自功能文档
返回值类型: 包含路径目录信息的字符串,如果path表示根目录,则为空引用( Visual中为Nothing)。 (重点由我补充)
发布于 2009-11-04 07:44:44
实际上,这个函数应该更好地命名为GetPathName。它返回您传递的文件名目录的完整路径。
https://stackoverflow.com/questions/1672236
复制相似问题