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 只有文件夹名称。我不知道这种区别背后的实现细节的原因。这可能是一个错误。
为什么 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 只有文件夹名称。我不知道这种区别背后的实现细节的原因。这可能是一个错误。