为什么 DirectoryInfo.ToString
有时返回 FullName
(path) 有时只返回目录-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
实例只返回 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
还返回完整路径:C:\Users\Administrator\Desktop\unpack
也许是一个错误,但肯定是缺少文档。
教训很明确:永远不要使用 DirectoryInfo.ToString
或者将实例传递给 String.Format
(或字符串插值)之类的方法,如果 DirectoryInfo
实例是通过 DirectoryInfo.Parent
初始化的,则隐式使用 ToString
.由于您通常不知道它是如何初始化的,因此通常最好避免使用 DirectoryInfo.ToString
。这个错误(不一致的、不透明的行为)可能会在未来被修复,这会破坏代码。
最佳答案
我查看了 Microsoft 提供的 DirectoryInfo
源代码,您可以轻松重现此行为。他们正在使用 Internal constructor internal DirectoryInfo(String fullPath, bool junk)
当你调用 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
来获取结果。仅返回文件夹名称。我不知道这种区别背后的实现细节的原因。这可能是一个错误。
关于c# - DirectoryInfo.ToString 在父目录上的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45184841/