DirectoryInfo.ToString 在父目录上的工作方式不同?

DirectoryInfo.ToString works differently on Parent directories?

为什么 DirectoryInfo.ToString 有时 returns FullName(路径),有时只是目录 - Name?我只是注意到它,因为我试图在此处将父目录名称与目录名称连接起来:

DirectoryInfo dir = new DirectoryInfo(@"C:\Users\Administrator\Desktop\unpack\folder1");
DirectoryInfo parentDir = dir.Parent;
var dirAndParent = $"{parentDir}{Path.DirectorySeparatorChar}{dir.Name}";

令我惊讶的是,它有效并返回了所需的部分 unpack\folder1。 我以为我需要 parentDir.Name 而不是 parentDir,类似于 dir.Name。如果我从 dir.Name 中删除 Name,我将获得目录的完整路径。但是父 DirectoryInfo 实例只是 returns Name

它在哪里记录,两个 DirectoryInfo 实例之间有什么区别?

Console.WriteLine("dir.ToString: \t\t" + dir.ToString());
Console.WriteLine("parentDir.ToString: \t" + parentDir.ToString());

将为dir输出FullName(路径),为parentDir输出Name

dir.ToString:           C:\Users\Administrator\Desktop\unpack\folder1
parentDir.ToString:     unpack

parentDir.FullName returns 还有完整路径:C:\Users\Administrator\Desktop\unpack


可能是一个错误,但肯定是缺少文档。 教训很明确:如果 DirectoryInfo 实例是通过 DirectoryInfo.Parent。由于您通常不知道它是如何初始化的,因此通常最好避免使用 DirectoryInfo.ToString。这个错误(不一致的、不透明的行为)可能会在未来被修复,这会破坏代码。

查看 MSDN 中的 ToString 定义,似乎是对该方法的调用 returns 传入的原始路径。

在你的通话中

DirectoryInfo dir = new DirectoryInfo(@"C:\Users\Administrator\Desktop\unpack\folder1");

您传入了目录的完整路径。通过使用 属性 访问父节点,您没有使用完整路径显式调用构造函数。在内部它可能使用了相对路径。

我查看了 Microsoft 提供的 DirectoryInfo 源代码,您可以轻松重现此行为。当您调用 Parent 属性 时,他们正在使用 Internal constructor internal DirectoryInfo(String fullPath, bool junk)

以下重现了您的问题,但未调用 Parent

var dirInfoUsingPublicConstructor = new DirectoryInfo(@"C:\Test");
Console.WriteLine(dirInfoUsingPublicConstructor.ToString());

var ctor = typeof(DirectoryInfo).GetConstructors(BindingFlags.NonPublic 
                                                | BindingFlags.Instance).First();
var dirInfoUsingInternalConstructor = 
            ctor.Invoke(new object[] { @"C:\Test", false }) as DirectoryInfo;
Console.WriteLine(dirInfoUsingInternalConstructor.ToString());

结果:

C:\Test
Test

在内部,该构造函数使用 Path.GetFileName 来获取结果。其中 returns 只有文件夹名称。我不知道这种区别背后的实现细节的原因。这可能是一个错误。