你的位置:首页 > ASP.net教程

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


 

目录索引 

 

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

 

简介

 

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

 

 

获取文件的绝对路径

 

   在以前的操作中,这个应该是十分简单的,可以通过 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 组合路径,应用程序的目录的绝对路径 + 虚拟路径转绝对路径

  

  /// <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           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 /// <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           else15             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       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 /// <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     }

 

 

 

 

 

  

 

 

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

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

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

 

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