Tim*_*ter 4 .net c# io directoryinfo
为什么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}";
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这工作并返回了所需的部分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());
Run Code Online (Sandbox Code Playgroud)
将输出FullName(路径)for dir和Namefor parentDir:
dir.ToString: C:\Users\Administrator\Desktop\unpack\folder1
parentDir.ToString: unpack
Run Code Online (Sandbox Code Playgroud)
parentDir.FullName 返回完整路径: C:\Users\Administrator\Desktop\unpack
也许是一个错误,但肯定缺乏文档.经验教训很明确:永远不要使用DirectoryInfo.ToString或将实例传递给像String.Format(或字符串插值)这样的方法,ToString如果DirectoryInfo实例是通过实例初始化的话,它会隐式使用DirectoryInfo.Parent.由于您经常不知道它是如何初始化的,因此最好避免DirectoryInfo.ToString一般情况.这个错误(不一致,不透明的行为)将来可能会修复,这会破坏代码.
我查看DirectoryInfo了Microsoft提供的源代码,您可以轻松地重现此行为.他们在调用属性时使用Internal构造函数 .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());
Run Code Online (Sandbox Code Playgroud)
结果:
C:\Test
Test
Run Code Online (Sandbox Code Playgroud)
在内部,该构造函数用于Path.GetFileName获取结果.仅返回文件夹名称.我不知道实现细节中这种区别背后的原因.这可能是一个错误.
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |