为什么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
。这个错误(不一致,不透明的行为)将来可能会修复,这会破坏代码。
答案 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访问父节点,您没有使用完整路径显式调用构造函数。在内部,它可能使用了相对路径。