gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:48:35 24 4
gpt4 key购买 nike

为什么 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com