永州网,内容丰富有趣,生活中的好帮手!
永州网 > 知识 > 正文

【无私分享:ASP.NET CORE 项目实战(第七章)】文件操作 FileHelper

时间:2000-03-24

今天,我们就对一些基本的操作写了一个 FileHelper 类,供大家探讨

友情提示:本文共有 2574 个字,阅读大概需要 6 分钟。

目录索引

?

【无私分享:ASP.NET CORE 项目实战】目录索引

?

简介

?

在程序设计中,我们很多情况下,会用到对文件的操作,在上一个系列 中,我们有很多文件基本操作的示例,在Core中有一些改变,主要是我们常用的Server.MapPath()不存在了,不知道后续的版本会不会有,在这里,我们只能自己封装方法去实现。今天,我们就对一些基本的操作写了一个 FileHelper 类,供大家探讨。在此要感谢以为不愿意透漏姓名的大神的帮助:@YINYEJUN

?

?

获取文件的绝对路径

?

?在以前的操作中,这个应该是十分简单的,可以通过?System.Web.HttpContext.Current.Server.MapPath("...") 直接获取,简介中,我们讲过,这个方法已经不存在了,网上翻阅了很多资料,Server.MapPath 最终调用?HostingEnvironment.MapPath() ,但是,它创建了一个特定选项的?virtualpath 对象,我们暂时先不管这些原理性的东西,我们看下如何去实现。

我们这里需要用到?IHostingEnvironment ,注入的方式有很多,最推荐的是 构造器 的注入,例如:

public readonly IHostingEnvironment _Env;

public FileHelper(IHostingEnvironment Env)

{

_Env = Env;

}?

?

但是,现实情况是,我们希望这个类里的方法都是静态方法,可以直接调用 FileHelper.MapPath(),当然这不是主要因素,主要因素是 我们在 其它的帮助类里也要调用这个方法,比如 我们在 Uitls 类里 有个读取文件内容的方法调用这个方法获取绝对路径,在两种情况下,构造器的注入显然是不合适的。

?因此,我们如何去实现呢?

一:我们添加两个静态类 Extensions 、DI

?

?

二:在Startup.cs 的?Configure 方法中添加:

?

?

添加完这两个类,我们回到?FileHelper?

定义两个静态字段:

? ? ? DirectorySeparatorChar:目录分隔符,因为是跨平台的应用,我们要判断目录分隔符,windows 下是 "", Mac OS and Linux 下是 "/"

? ? ?_ContentRootPath:包含应用程序的目录的绝对路径

我们现在写一个获取文件绝对路径的静态方法 MapPath(string path)

逻辑是:①:判断是否是绝对路径,如果是绝对路径直接返回当前路径

? ? ? ②:如果不是绝对路径,我们通过 Path.Combine 组合路径,应用程序的目录的绝对路径 虚拟路径转绝对路径

///

/// 获取文件绝对路径

///

/// 文件路径

///

public static string MapPath(string path)

{

return IsAbsolute(path) ? path : Path.Combine(_ContentRootPath , path.TrimStart('~','/').Replace("/", DirectorySeparatorChar));

}

?

说明:

_ContentRootPath 是我们在 开始 获取的 应用程序的绝对路径?private static string _ContentRootPath = DI.ServiceProvider.GetRequiredService().ContentRootPath;

?对于传递进来的 path , 我们首先用 TrimStart 去除路径中的“~”和 “/”,然后通过?Replace 替换 目录分隔符 为 当前系统的目录分隔符

IsAbsolute 是我们定义的方法,判断当前路径是否为绝对路径(见下文)

?

判断当前路径是否为绝对路径

我们用了一个简单的办法来判断当前路径是否为绝对路径,我们获取系统盘符,windows 的系统盘符为“:”;Mac OS 和 Linux 没有盘符的概念都是“/”开始,所以我们判断是否包含“”:

? ? ??

1 ///

2 /// 是否是绝对路径 3 /// windows下判断 路径是否包含 ":" 4 /// Mac OS、Linux下判断 路径是否包含 "" 5 /// 6 /// 路径 7 /// 8 public static bool IsAbsolute(string path) 9 {10 return Path.VolumeSeparatorChar == ':' ? path.IndexOf(Path.VolumeSeparatorChar) > 0 : path.IndexOf('') > 0;11 }

?

?

?

文件的基本操作(这些操作基本跟以前没什么区别,给大家参考一下)

所有的路径,我们都用到了?IsAbsolute(path) ? path : MapPath(path),一个三元运算符,用户判断如果非绝对路径转为绝对路径。

检测指定路径是否存在:

1 ///

2 /// 检测指定路径是否存在 3 /// 4 /// 路径 5 /// 是否是目录 6 /// 7 public static bool IsExist(string path,bool isDirectory) 8 { 9 return isDirectory ? Directory.Exists(IsAbsolute(path) ? path : MapPath(path)) : File.Exists(IsAbsolute(path) ? path : MapPath(path));10 }

?

检测目录是否为空

1 ///

2 /// 检测目录是否为空3 /// 4 /// 路径5 /// 6 public static bool IsEmptyDirectory(string path)7 {8 return Directory.GetFiles(IsAbsolute(path) ? path : MapPath(path)).Length <= 0 && Directory.GetDirectories(IsAbsolute(path) ? path : MapPath(path)).Length <= 0;9 }

?

?

创建文件或目录

?

1 ///

2 /// 创建目录或文件 3 /// 4 /// 路径 5 /// 是否是目录 6 public static void CreateFiles(string path, bool isDirectory) 7 { 8 try { 9 if (!IsExist(path, isDirectory))10 {11 if (isDirectory)12 Directory.CreateDirectory(IsAbsolute(path) ? path : MapPath(path));13 else14 {15 FileInfo file = new FileInfo(IsAbsolute(path) ? path : MapPath(path));16 FileStream fs = file.Create();17 fs.Dispose();18 }19 } 20 }21 catch(Exception ex)22 {23 throw ex;24 }25 }

?

?

?删除文件或目录

?

1 ///

2 /// 删除目录或文件 3 /// 4 /// 路径 5 /// 是否是目录 6 public static void DeleteFiles(string path, bool isDirectory) 7 { 8 try 9 {10 if (!IsExist(path, isDirectory))11 {12 if (isDirectory)13 Directory.Delete(IsAbsolute(path) ? path : MapPath(path));14 else15 File.Delete(IsAbsolute(path) ? path : MapPath(path)); 16 }17 }18 catch (Exception ex)19 {20 throw ex;21 }22 }

?

清空目录下所有文件及子目录,依然保留该目录

1 ///

2 /// 清空目录下所有文件及子目录,依然保留该目录 3 /// 4 /// 5 public static void ClearDirectory(string path) 6 { 7 if(IsExist(path,true)) 8 { 9 //目录下所有文件10 string[] files = Directory.GetFiles(IsAbsolute(path) ? path : MapPath(path));11 foreach(var file in files)12 {13 DeleteFiles(file, false);14 }15 //目录下所有子目录16 string[] directorys = Directory.GetDirectories(IsAbsolute(path) ? path : MapPath(path));17 foreach(var dir in directorys)18 {19 DeleteFiles(dir, true);20 }21 }22 }

?

复制文件、移动文件

1 ///

2 /// 复制文件内容到目标文件夹 3 /// 4 /// 源文件 5 /// 目标文件夹 6 /// 是否可以覆盖 7 public static void Copy(string sourcePath,string targetPath,bool isOverWrite=true) 8 { 9 File.Copy(IsAbsolute(sourcePath) ? sourcePath : MapPath(sourcePath), (IsAbsolute(targetPath) ? targetPath : MapPath(targetPath)) GetFileName(sourcePath), isOverWrite);10 }

?

?

1 ///

2 /// 移动文件到目标目录 3 /// 4 /// 源文件 5 /// 目标目录 6 public static void Move(string sourcePath, string targetPath) 7 { 8 string sourceFileName = GetFileName(sourcePath); 9 //如果目标目录不存在则创建10 if(!IsExist(targetPath, true))11 {12 CreateFiles(targetPath, true);13 }14 else15 {16 //如果目标目录存在同名文件则删除17 if (IsExist(Path.Combine(IsAbsolute(targetPath) ? targetPath : MapPath(targetPath), sourceFileName), false))18 {19 DeleteFiles(Path.Combine(IsAbsolute(targetPath) ? targetPath : MapPath(targetPath), sourceFileName), true);20 }21 }22 23 File.Move(IsAbsolute(sourcePath) ? sourcePath : MapPath(sourcePath), Path.Combine(IsAbsolute(targetPath) ? targetPath : MapPath(targetPath), sourceFileName));24 25 26 }

?

获取文件名和扩展名

1 ///

2 /// 获取文件名和扩展名 3 /// 4 /// 文件路径 5 /// 6 public static string GetFileName(string path) 7 { 8 return Path.GetFileName(IsAbsolute(path) ? path : MapPath(path)); 9 }10 11 /// 12 /// 获取文件名不带扩展名13 /// 14 /// 文件路径15 /// 16 public static string GetFileNameWithOutExtension(string path)17 {18 return Path.GetFileNameWithoutExtension(IsAbsolute(path) ? path : MapPath(path));19 }20 21 /// 22 /// 获取文件扩展名23 /// 24 /// 文件路径25 /// 26 public static string GetFileExtension(string path)27 {28 return Path.GetExtension(IsAbsolute(path) ? path : MapPath(path));29 }

?

?

修正:

对于是否是绝对路径,我们在MapPath(string path) 方法中已经做了判断,所以其它方法没有必要再次判断,其余方法中的?IsAbsolute(path) ? path : MapPath(path) 可直接改为?MapPath(path),

感谢@shoufengwei !

?

?

?

??

?

?

希望跟大家一起学习Asp.net Core?

刚开始接触,水平有限,很多东西都是自己的理解和翻阅网上大神的资料,如果有不对的地方和不理解的地方,希望大家指正!

虽然Asp.net Core 现在很火热,但是网上的很多资料都是前篇一律的复制,所以有很多问题我也暂时没有解决,希望大家能共同帮助一下!

?

原创文章 转载请尊重劳动成果?http://yuangang.cnblogs.com

?

来源:https://www.icode9.com/content-1-698451.html

收集不易,本文《【无私分享:ASP.NET CORE 项目实战(第七章)】文件操作 FileHelper》知识如果对你有帮助,请点赞收藏并留下你的评论。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
英特尔推出顶级Core+i9处理器 为笔记本电脑提供无与伦比的功能

英特尔推出顶级Core+i9处理器 为笔记本电脑提供无与伦比的功能

英特尔公司宣布:第八代Core i9现在可以作为其“有史以来最高性能的笔电处理器”,与第七代基于Core i7的PC相比,Core i9的性能提高了29%。第八代Core i9处理器更加适用于游戏玩家和内容创作者。Core i9针对于游戏玩家的FPS将提高...

2024-01-17 #头条

在VB.NET中进行抓屏

在VB.NET中进行抓屏

窗体,所必需,代码,过程,图象,声明,组件,不要使用,事件中,可以使用,代码编辑器,将以下,用一些,添加到

2000-03-18 #知识

六经辨证实战要略篇----序言(杨柳)

六经辨证实战要略篇----序言(杨柳)

六经辨证,六经,思维,六合堂,伤寒,实战,脏腑,杨柳,仲景,蔡师,人体,祖师爷,层次,大道,生命,风寒,变化,却没有,而是一种,常在,个人,世人,三元里,中医,典籍,体虚,原意,医家,刚柔,医者

1999-12-05 #社会

实战技巧之成交量:辨别放量过头 轻松过头形态 伏击强势股!

实战技巧之成交量:辨别放量过头 轻松过头形态 伏击强势股!

头部,股价,放量,突破,成交量,回调,买点,实战,特征,案例,芝麻,个人观点,依据,形式,阳线,行情,蓝字,观点,投资,能不能,创新高,不作为,仅代表,前头部,发起冲击,战中常,头部形成,有两种,操作风险,有时是

2000-03-30 #推荐

「函数007」- EXCEL多表关联查询实战

「函数007」- EXCEL多表关联查询实战

公式,地址,单元格,作用,动画,函数,参数,月份,案例,数据,行号,语法,一行,序列,关注点,功能,啰嗦,实战,教程,所在,技巧,数值,方案,菜单,版本,来源,核心,英文,逗号,行列

2000-04-14 #知识

西昌卫星发射中心举办实战实训庆祝中国航天日

西昌卫星发射中心举办实战实训庆祝中国航天日

西昌卫星发射中心为庆祝“中国航天日”,举行了一场实战实训活动。活动以“实战实训,强化备战能力”为主题,旨在提高航天人员在实际工作中的应急处置和危机处理能力。在活动中,航天人员通过模拟各种危险情况,进行...

2024-02-05 #知识

【原创分享】变频器双电机驱动主从控制实战

【原创分享】变频器双电机驱动主从控制实战

料车,变频器,方式,电机,主机,系统,速度,运行,信号,主从,参数,控制器,小车,斜坡,过程,上料,炉顶,联锁,高炉,阶段,速度控制,位置,制动器,抱闸,故障,机械,端子,保护信号,高炉上料,钢丝绳

1999-12-11 #知识

实战奇门遁甲入门篇-八门

实战奇门遁甲入门篇-八门

奇门,奇门遁甲,吉门,杜门,门克宫,八神,古人,何宫,基础,入门篇,事项,中平,中国,中极,之门,事物,九宫,人格,人事,代表人,人间,八卦,内容,关系,史载,历朝历代,吉凶,周遭,大利,天象

2000-01-12 #知识