【无私分享:ASP.NET CORE 项目实战】目录索引html
在程序设计中,咱们不少状况下,会用到对文件的操做,在 上一个系列 中,咱们有不少文件基本操做的示例,在Core中有一些改变,主要是咱们经常使用的Server.MapPath()不存在了,不知道后续的版本会不会有,在这里,咱们只能本身封装方法去实现。今天,咱们就对一些基本的操做写了一个 FileHelper 类,供你们探讨。在此要感谢觉得不肯意透漏姓名的大神的帮助:@YINYEJUNgit
在之前的操做中,这个应该是十分简单的,能够经过 System.Web.HttpContext.Current.Server.MapPath("...") 直接获取,简介中,咱们讲过,这个方法已经不存在了,网上翻阅了不少资料,Server.MapPath 最终调用 HostingEnvironment.MapPath() ,可是,它建立了一个特定选项的 virtualpath 对象,咱们暂时先无论这些原理性的东西,咱们看下如何去实现。github
咱们这里须要用到 IHostingEnvironment ,注入的方式有不少,最推荐的是 构造器 的注入,例如: windows
public readonly IHostingEnvironment _Env;ide
public FileHelper(IHostingEnvironment Env)
{
_Env = Env;
} post
可是,现实状况是,咱们但愿这个类里的方法都是静态方法,能够直接调用 FileHelper.MapPath(),固然这不是主要因素,主要因素是 咱们在 其它的帮助类里也要调用这个方法,好比 咱们在 Uitls 类里 有个读取文件内容的方法调用这个方法获取绝对路径,在两种状况下,构造器的注入显然是不合适的。学习
所以,咱们如何去实现呢?ui
一:咱们添加两个静态类 Extensions 、DIurl
二:在Startup.cs 的 Configure 方法中添加:spa
添加完这两个类,咱们回到 FileHelper
定义两个静态字段:
DirectorySeparatorChar:目录分隔符,由于是跨平台的应用,咱们要判断目录分隔符,windows 下是 "\", Mac OS and Linux 下是 "/"
_ContentRootPath:包含应用程序的目录的绝对路径
咱们如今写一个获取文件绝对路径的静态方法 MapPath(string path)
逻辑是:①:判断是不是绝对路径,若是是绝对路径直接返回当前路径
②:若是不是绝对路径,咱们经过 Path.Combine 组合路径,应用程序的目录的绝对路径 + 虚拟路径转绝对路径
/// <summary>
/// 获取文件绝对路径
/// </summary>
/// <param name="path">文件路径</param>
/// <returns></returns>
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<IHostingEnvironment>().ContentRootPath;
对于传递进来的 path , 咱们首先用 TrimStart 去除路径中的“~”和 “/”,而后经过 Replace 替换 目录分隔符 为 当前系统的目录分隔符
IsAbsolute 是咱们定义的方法,判断当前路径是否为绝对路径(见下文)
咱们用了一个简单的办法来判断当前路径是否为绝对路径,咱们获取系统盘符,windows 的系统盘符为“:”;Mac OS 和 Linux 没有盘符的概念都是“/”开始,因此咱们判断是否包含“\”:
1 /// <summary> 2 /// 是不是绝对路径 3 /// windows下判断 路径是否包含 ":" 4 /// Mac OS、Linux下判断 路径是否包含 "\" 5 /// </summary> 6 /// <param name="path">路径</param> 7 /// <returns></returns> 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 /// <summary> 2 /// 检测指定路径是否存在 3 /// </summary> 4 /// <param name="path">路径</param> 5 /// <param name="isDirectory">是不是目录</param> 6 /// <returns></returns> 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 /// <summary> 2 /// 检测目录是否为空 3 /// </summary> 4 /// <param name="path">路径</param> 5 /// <returns></returns> 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 /// <summary> 2 /// 建立目录或文件 3 /// </summary> 4 /// <param name="path">路径</param> 5 /// <param name="isDirectory">是不是目录</param> 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 else 14 { 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 /// <summary> 2 /// 删除目录或文件 3 /// </summary> 4 /// <param name="path">路径</param> 5 /// <param name="isDirectory">是不是目录</param> 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 else 15 File.Delete(IsAbsolute(path) ? path : MapPath(path)); 16 } 17 } 18 catch (Exception ex) 19 { 20 throw ex; 21 } 22 }
清空目录下全部文件及子目录,依然保留该目录
1 /// <summary> 2 /// 清空目录下全部文件及子目录,依然保留该目录 3 /// </summary> 4 /// <param name="path"></param> 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 /// <summary> 2 /// 复制文件内容到目标文件夹 3 /// </summary> 4 /// <param name="sourcePath">源文件</param> 5 /// <param name="targetPath">目标文件夹</param> 6 /// <param name="isOverWrite">是否能够覆盖</param> 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 /// <summary> 2 /// 移动文件到目标目录 3 /// </summary> 4 /// <param name="sourcePath">源文件</param> 5 /// <param name="targetPath">目标目录</param> 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 else 15 { 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 /// <summary> 2 /// 获取文件名和扩展名 3 /// </summary> 4 /// <param name="path">文件路径</param> 5 /// <returns></returns> 6 public static string GetFileName(string path) 7 { 8 return Path.GetFileName(IsAbsolute(path) ? path : MapPath(path)); 9 } 10 11 /// <summary> 12 /// 获取文件名不带扩展名 13 /// </summary> 14 /// <param name="path">文件路径</param> 15 /// <returns></returns> 16 public static string GetFileNameWithOutExtension(string path) 17 { 18 return Path.GetFileNameWithoutExtension(IsAbsolute(path) ? path : MapPath(path)); 19 } 20 21 /// <summary> 22 /// 获取文件扩展名 23 /// </summary> 24 /// <param name="path">文件路径</param> 25 /// <returns></returns> 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