为了便于处理文件路径,以及兼容处理Windows和Linux,封装了路径扩展PathHelper
Nuget包:NewLife.Core
源码:https://github.com/NewLifeX/X/blob/master/NewLife.Core/IO/PathHelper.cs
视频:https://www.bilibili.com/video/BV1gq4y1g78w
视频:https://www.bilibili.com/video/BV1oN4y1A7jo
最佳实践
任何类型.NET项目,引用 NewLife.Core 包以及添加System.IO命名空间后,都可以使用以下方法获取绝对路径。
var dir = "../cube".GetFullPath();
相对路径转全路径
相对路径转绝对完全路径有很深的讲究,这里要分三种情况考虑。
同时,以下方法全部支持Windows和Linux路径。两种系统中,路径分隔符不相同,但不管应用代码中使用哪一种路径分隔符,经过以下方法后,都将转换为当前操作系统兼容的路径。
这些方法是我们所有系统能够平滑从Windows过渡到Linux的根本保障。
GetBasePath 依赖BasePath,支持参数和环境变量设置,主要用于存放X组件自身配置和日志等目录。
GetFullPath 依赖BaseDirectory,默认为应用程序域基础目录,支持参数和环境变量设置,此时跟GetBasePath保持一致。
GetFullPath更多用于表示当前工作目录,不可以轻易修改为Environment.CurrentDirectory。
在vs运行应用时,Environment.CurrentDirectory是源码文件所在目录,而不是可执行文件目录。
在StarAgent运行应用时,BasePath和Environment.CurrentDirectory都被修改为工作目录。
GetFullPath
获取文件或目录基于应用程序域基目录的全路径,过滤相对目录。(顶级推荐!!!)
不确保目录后面一定有分隔符,是否有分隔符由原始路径末尾决定。
该方法最常用,绝大多数情况下,相对路径都是相对于当前应用程序所在目录。
应用程序域基路径,AppDomain.CurrentDomain.BaseDirectory
基于BaseDirectory,可以通过程序参数-BasePath {mypath}
指定,也可以通过环境变量BasePath
指定。
推荐使用该方法!
GetBasePath
获取文件或目录基于BasePath的全路径,过滤相对目录。
基路径PathHelper.BasePath默认也是应用程序域基路径,AppDomain.CurrentDomain.BaseDirectory
但是它可以通过程序参数-BasePath {mypath}
指定,也可以通过环境变量BasePath
指定。
基路径用于X组件内部各目录,专门为Docker容器化和函数计算而定制。
受影响的内部目录有:Log,Config,Data,Backup
在某些场景中,应用程序没有所在目录的写入权限,需要借助参数把基路径修改到别的可写入目录!
该方法只用于X组件内部,不推荐应用程序使用!
GetCurrentPath
获取文件或目录基于当前目录的全路径,过滤相对目录。
操作系统进程级的当前目录, Environment.CurrentDirectory
极少使用,一般使用GetFullPath替代。主要因为当前目录可以在程序运行过程中由外部改变,从而带来不一致性。
多路径合并CombinePath
很多人使用字符串拼接来合并两个路径,最要命的地方在于分隔符,不是多了就是少了,或者用错了(Windows和Linux分隔符不同)!
该方法支持连续合并多段路径,无需担心分隔符,并且多操作系统兼容
检查并创建目录EnsureDirectory
平时写入文件时,最容易疏忽的就是目录不存在,尽管打开文件时指定了Create,仍然报IO异常。
可以养成一个习惯,在所有需要写入文件之前,都假定目录不存在,用EnsureDirectory先检测一次,如果目录不存在它会自动创建!
文件信息扩展
常用扩展:
- AsFile,字符串路径转为文件信息FileInfo
- ReadBytes,从文件中读取数据
- WriteBytes,向文件写入数据
- ReadText,从文件读取文本
- WriteText,向文件写入文本
- Extract,解压缩文件到目标目录,内部支持zip,其它格式通过外挂7z来支持
- Compress,压缩文件,内部支持zip,其它格式通过外挂7z来支持
目录信息扩展
常用扩展:
- AsDirectory,字符串路径转为路径信息 DirectoryInfo
- GetAllFiles,获取目录内所有符合条件的文件,支持多文件扩展匹配,如*.exe;*.dll;*.config
- Compress,压缩指定目录,内部支持zip,其它格式通过外挂7z来支持