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

标签 c# .net io directoryinfo

为什么 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());

将输出 dirFullName(路径)和 parentDirName:

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/

相关文章:

c# - 如何在 ServiceStack 中进行身份验证后重定向

java - 为什么 Java 磁盘 I/O 的执行速度比用 C 编写的等效 I/O 代码慢得多?

c - 如何在 C 中测试 CLONE_VM、CLONE_FS 和 CLONE_IO 的效果?

c# - Azure错误: DefaultAzureCredential authentication failed

c# - 在 WebView 中滚动太快时,通用 Windows Phone 8.1 应用程序崩溃

c# - 如何在C#中修改字典中的键

.net - [PHP] : Is it possible to access . 通过 PHP NET DLL?

mysql - 物理内存空闲时使用的交换空间

将颜色着色一定百分比的 C# 算法

c# - 101 Rx 示例