.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 源码,发现除了判断路径是否为空,没有任何其它检查
而 Create 方法也只是一句,调用底层文件系统创建目录
public void Create() => FileSystem.CreateDirectory(FullPath);
总结
.Net Core和.Net Fx是兼容关系,而不是继承关系,即使同样的类库,运行结果也有差异
或许 .Net Core 将来的版本会加上路径检查的功能,比如给 Path 添加一个 IsPathNormalized(string path) 静态方法,给 FileInfo/DirectoryInfo 添加一个 IsValid() 实例方法
最新文章
- PowerShell中的基础数据类型
- MySql中文乱码
- Hadoop之Storm安装
- 管理不同版本ruby和rails的利器——rvm
- [转载]两个半小时学会Perl
- 解决android调用IIS Express中的WCF服务时,出现错误400问题
- Dollars
- Semantic UI中的验证控件的事件的使用
- centos redis 安装
- HDU 5240 Exam
- c3p0数据库连接池+mysql数据库基本使用方法
- iOS 开发之 Xcode installation failed invalid argument!
- Codeforces Round #505 (Div 1 + Div 2 Combined) Solution
- cocos2d-x JS 随机数
- 【Java】Java批量文件打包下载zip
- php提交表单校验例子
- flask-mysqldb安装时EnvironmentError: mysql_config not found
- EF 通过DataAnnotations配置属性和类型
- input、textArea实时显示剩余可输入的字数
- solr学习(一)
热门文章
- CF1253E Antenna Coverage(DP)
- C#开发BIMFACE系列29 服务端API之获取模型数据14:获取图纸列表
- umi+dva+antd新建项目(亲测可用)
- spring cloud 2.x版本 Spring Cloud Stream消息驱动组件基础教程(kafaka篇)
- Nginx 极简教程(快速入门)
- 《DSLR-Quality Photos on Mobile Devices with Deep Convolutional Networks》研读笔记
- 简单解决 VMWare “无法打开内核设备:\\Global\\vmx86”错误
- 用Python制作只属于你和ta的聊天渠道吧
- 用 Python 监控知乎和微博的热门话题
- Dynamics CRM中的注释(Note)及RollupRequest消息初探