.Net Framework与.Net Core文件系统的差异

在.Net Fx下,可通过try/catch实例化DirectoryInfo/FileInfo来判断用户输入的路径是否合法,但我把代码拷到 .Net Core 下运行,发现运行结果完全不同

var di = new DirectoryInfo(@"!@#¥%35|¥%/¥^[<(国)>]……%、/-\=+&*……#@"); //.Net Framework 下抛出 ArgumentException 异常:路径中具有非法字符。
di.Create();  //.Net Core 下抛出 IOException 异常:文件名、目录名或卷标语法不正确。

以上代码在 .Net Fx 4.6.1 第一句就会抛出 System.ArgumentException 异常,因为路径中具有非法字符,DirectoryInfo 实例化失败

而在 .Net Core 2.2 中第一句不会报错,第二句会抛出 System.IO.IOException 异常,这大概是因为 .Net Core 是跨平台,针对不同操作系统做统一路径判断比较麻烦,干脆就不判断(乱写都可以),在 Create 方法中也没有进行判断,而直接将系统IO异常返回

 

为了印证以上观点

查看.Net Fx源码(也可以反编译),发现 DirectoryInfo 构造方法内部对路径进行了大量检查,比如非法字符和路径长度
https://referencesource.microsoft.com/#mscorlib/system/io/directoryinfo.cs,30fa608717e5ce8e

构造方法内部调用顺序:DirectoryInfo(string path) -> Init(string path, bool checkHost) -> Directory.GetFullPathAndCheckPermissions(path, checkHost) -> Path.GetFullPathInternal(path) -> NormalizePath(path, fullCheck: true) -> Path.NormalizePath(string path, bool fullCheck, int maxPathLength) -> Path.NormalizePath(path, fullCheck, maxPathLength, expandShortPaths: true) -> Path.LegacyNormalizePath(path, fullCheck, maxPathLength, expandShortPaths)

 

接着查看 .Net Core 源码,发现除了判断路径是否为空,没有任何其它检查

https://github.com/dotnet/corefx/blob/215f374988eba0829f6880026909851ed04a8638/src/System.IO.FileSystem/src/System/IO/DirectoryInfo.cs

而 Create 方法也只是一句,调用底层文件系统创建目录

public void Create() => FileSystem.CreateDirectory(FullPath);

 

总结

.Net Core和.Net Fx是兼容关系,而不是继承关系,即使同样的类库,运行结果也有差异

或许 .Net Core 将来的版本会加上路径检查的功能,比如给 Path 添加一个 IsPathNormalized(string path) 静态方法,给 FileInfo/DirectoryInfo 添加一个 IsValid() 实例方法

posted @ 2019-12-16 00:18  felixnet  阅读(769)  评论(0编辑  收藏  举报