首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么GetDirectoryName为C:\返回null?

为什么GetDirectoryName为C:\返回null?
EN

Stack Overflow用户
提问于 2009-11-04 07:41:43
回答 3查看 1.5K关注 0票数 1

我刚发现了一个看起来很奇怪的设计选择:

代码语言:javascript
运行
复制
System.IO.Path.GetDirectoryName(@"C:\folder\file.ext")

返回“C:\文件夹”

代码语言:javascript
运行
复制
System.IO.Path.GetDirectoryName(@"C:\") 

返回null。

如果第一个示例返回“文件夹”,我可以更好地理解它。

有什么想法吗,,为什么是这样的?当你只想得到文件夹路径时,你会做什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-17 20:52:46

好吧,我知道这个问题已经好几年没提过了,但是没有人真正回答‘为什么是这种情况?’,所以我要对这个问题做一个长篇大论的回答。

仅就这一解释而言,路径对于Windows来说是一种概念性的东西。出于实际目的,只有两种类型的路径。

  • 本地路径-以驱动器字母( C:\Folder\File.ext )开头
  • 远程路径-从服务器和共享( \Server\Share\Folder\File.ext )开始

我故意忽略相对路径,因为所有相对路径都可以转换成一个完整的路径,这是上述两条路径之一。

考虑以下代码:

代码语言:javascript
运行
复制
        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}'");
        }

如果你运行这个,我认为,一个有趣的模式:

代码语言:javascript
运行
复制
 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的所有内容要么本身就是根路径,要么不是根路径。

我们可以在概念上把事情规划出来:

代码语言:javascript
运行
复制
 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大于根长度,可以看到它们考虑到了这一点。

代码语言:javascript
运行
复制
while (i > root && path[--i] != DirectorySeparatorChar && path[i] != AltDirectorySeparatorChar);

因此,如果您传递这个函数,一个像'C:\‘这样的路径参数本身就是一个根。

现在,也许它不是最好的函数名,但是GetDirectoryName可能被合理地认为是‘获取包含该文件(或目录)的目录’,当您这样想它时,它突然变得有意义了。也许GetParentDirectory会是个更好的名字。

获取包含C:\Folder\file.ext的目录,明显的结果是C:\文件夹。

获取包含C:\文件夹的目录,结果是C:\ contains文件夹上的根目录。

获取包含C:\的目录,答案必须为NULL/nothing,因为根目录没有父目录。

票数 4
EN

Stack Overflow用户

发布于 2009-11-04 07:47:01

来自功能文档

返回值类型: 包含路径目录信息的字符串,如果path表示根目录,则为空引用( Visual中为Nothing)。 (重点由我补充)

票数 4
EN

Stack Overflow用户

发布于 2009-11-04 07:44:44

实际上,这个函数应该更好地命名为GetPathName。它返回您传递的文件名目录的完整路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1672236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档