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

时间:2017-07-19 08:21:23

标签: c# .net io directoryinfo

为什么DirectoryInfo.ToString有时会返回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。如果我从Name删除dir.Name,我将获得目录的完整路径。但是父DirectoryInfo实例只返回Name

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

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

将输出FullName的{​​{1}}(路径)和dir的{​​{1}}:

Name

parentDir还会返回完整路径:dir.ToString: C:\Users\Administrator\Desktop\unpack\folder1 parentDir.ToString: unpack

也许是一个错误,但肯定缺乏文档。 教训很明确:永远不要使用DirectoryInfo.ToString或将实例传递给像parentDir.FullName(或字符串插值)这样的方法,如果C:\Users\Administrator\Desktop\unpack实例是通过{{初始化的话}隐式使用String.Format 3}}。由于您经常不知道如何初始化,因此最好避免ToString。这个错误(不一致,不透明的行为)将来可能会修复,这会破坏代码。

2 个答案:

答案 0 :(得分:6)

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

以下内容无需调用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来获取结果。仅返回文件夹名称。我不知道实现细节中这种区别背后的原因。这可能是一个错误。

答案 1 :(得分:0)

MSDN查看ToString定义,似乎对此方法的调用返回传入的原始路径。

在你的电话中

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

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