zoukankan      html  css  js  c++  java
  • 【无私分享: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

     

  • 相关阅读:
    SharePoint 2013 安装.NET Framework 3.5 报错
    SharePoint 2016 配置工作流环境
    SharePoint 2016 站点注册工作流服务报错
    Work Management Service application in SharePoint 2016
    SharePoint 2016 安装 Cumulative Update for Service Bus 1.0 (KB2799752)报错
    SharePoint 2016 工作流报错“没有适用于此应用程序的地址”
    SharePoint 2016 工作流报错“未安装应用程序管理共享服务代理”
    SharePoint JavaScript API in application pages
    SharePoint 2016 每天预热脚本介绍
    SharePoint 无法删除搜索服务应用程序
  • 原文地址:https://www.cnblogs.com/yuangang/p/5743660.html
Copyright © 2011-2022 走看看