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


     

    目录索引 

    【无私分享: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 类里 有个读取文件内容的方法调用这个方法获取绝对路径,在两种情况下,构造器的注入显然是不合适的

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

    一:我们添加两个静态类 ExtensionsDI

     

     

    二:在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                     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

     

  • 相关阅读:
    Maven的生命周期
    Maven坐标
    IDEA配置maven
    IDEA配置tomcat
    重写父类方法
    类的继承
    内部类
    static关键字
    线程相关知识
    数组
  • 原文地址:https://www.cnblogs.com/yuangang/p/5743660.html
Copyright © 2020-2023  润新知