1. 程式人生 > >【無私分享:ASP.NET CORE 專案實戰(第七章)】檔案操作 FileHelper

【無私分享:ASP.NET CORE 專案實戰(第七章)】檔案操作 FileHelper

目錄索引

簡介

  在程式設計中,我們很多情況下,會用到對檔案的操作,在 上一個系列 中,我們有很多檔案基本操作的示例,在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 現在很火熱,但是網上的很多資料都是前篇一律的複製,所以有很多問題我也暫時沒有解決,希望大家能共同幫助一下!

相關推薦

無私分享ASP.NET CORE 專案實戰檔案操作 FileHelper

目錄索引 簡介   在程式設計中,我們很多情況下,會用到對檔案的操作,在 上一個系列 中,我們有很多檔案基本操作的示例,在Core中有一些改變,主要是我們常用的Server.MapPath()不存在了,不知道後續的版本會不會有,在這裡,我們只能自己封裝方法去實現。今天,我們就對一些基本

無私分享ASP.NET CORE 專案實戰建立區域Areas,新增TagHelper

目錄索引 簡介   在Asp.net Core VS2015中,我們發現還有很多不太簡便的地方,比如右擊新增檢視,轉到試圖頁等功能圖不見了,雖然我們可以通過工具欄的自定義命令,把這兩個右擊選單新增上,但是貌似是灰色的不能用。   其實,這樣也好,通過手動建立,更讓我們深刻的理解M

無私分享ASP.NET CORE 專案實戰釋出專案到 Linux 上執行 Core 專案

目錄索引 簡介   ASP.Net Core 給我們帶來的最大的亮點就是跨平臺,我在我電腦(win7)上用虛擬機器建了個 CentOS7 ,來演示下,我們windows上的專案如何釋出專案到Linux上執行。我這裡有個在windows上搭建過的程式,我們主要演示如何在linux上執

無私分享ASP.NET CORE 專案實戰讀取配置檔案 appsettings.json

目錄索引 簡介   在我們之前的Asp.net mvc 開發中,一提到配置檔案,我們不由的想到 web.config 和 app.config,在 core 中,我們看到了很多的變化,新的配置系統顯得更加輕量級,具有更好的擴充套件性,並且支援多樣化的資料來源。   部落格園對於這個的

無私分享ASP.NET CORE 專案實戰讀取配置檔案 讀取自定義配置檔案

目錄索引 簡介   但隨之產生了問題:我們使用的是在 Startup.cs 中(如下圖)來實現配置讀取,有兩個問題 ① 我們如果定義N種配置,是否要再這裡新增N條這樣的配置 ; ② 如果我們的配置不想寫在appsettings.json中呢     解決問題

無私分享ASP.NET CORE 專案實戰十三Asp.net Core 使用MyCat分散式資料庫,實現讀寫分離

目錄索引 簡介   MyCat2.0版本很快就釋出了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amamiya Yuuko)的分享,但是,這中

無私分享ASP.NET CORE 專案實戰Code First 建立資料庫和資料表

目錄索引 簡介   本章我們來介紹下Asp.net Core 使用 CodeFirst 建立資料庫和表,通過 控制檯 和 dotnet ef 兩種方式 修改EF上下文物件,新增測試類   我修改了一下名字,Domains 改為了 wkmvc.Data   我們新建一個

無私分享ASP.NET CORE 專案實戰Repository倉儲 UnitofWork

1 public abstract class Repository<T> : IRepository<T> where T : class 2 { 3 #region 資料上下文 4 5 /// <s

無私分享ASP.NET CORE 專案實戰EntityFramework下領域驅動設計的應用

這好像就是比我的多了一個“中轉層”,把我們的介面作為了一箇中轉,領域層繼承了倉儲實現業務和資料操作,這有什麼實際意義嗎?希望大家指正一下: 我不理解的是,如果是按照這樣,那麼我如果要修改註冊方法,比如我要在上面方法中傳遞 eamil,name,password 的基礎上還需要傳遞手機號碼,那麼我需要修改

無私分享ASP.NET CORE 專案實戰十一Asp.net Core 快取 MemoryCache 和 Redis

1 /// <summary> 2 /// 修改快取 3 /// </summary> 4 /// <param name="key">快取Key</param> 5 ///

無私分享ASP.NET CORE 專案實戰十二新增對SqlServer、MySql、Oracle的支援

目錄索引 簡介   增加對多資料庫的支援,並不是意味著同時對多種資料庫操作,當然,後面,我們會嘗試同時對多種資料庫操作,這可能需要多個上下文,暫且不論。分散式資料庫,我們採用的是阿里雲的Mycat,這個後面會更新出來。我們今天的場景是:我們的專案可能是在windows上開發的使用的

無私分享ASP.NET CORE 專案實戰十四圖形驗證碼的實現

1 public class VierificationCodeServices 2 { 3 /// <summary> 4 /// 該方法用於生成指定位數的隨機數 5 /// </summary> 6

無私分享ASP.NET CORE 專案實戰第二新增EF上下文物件,新增介面、實現類以及無處不在的依賴注入DI

目錄索引 簡介   上一章,我們介紹了安裝和新建控制器、檢視,這一章我們來建立個數據模型,並且新增介面和實現類。 新增EF上下文物件   按照我們以前的習慣,我們還是新建幾個資料夾   Commons:存放幫助類   Domians:資料模型   Services

ASP.NET Core 專案實戰持續更新~~~

 一、前言   準備寫這個系列文章的設想開始於今年9月,毫無意外,期間又又又又拖了很長時間,文章主要是為了記錄自己學習使用 ASP.NET Core Web API 與 Vue 建立一個前後端分離的專案的整個過程。嗯,2018年快要結束了,應該能在 .NET Core 3.0 正式版和 Vue 3

ASP.NET Core中使用GraphQL - Mutation

ASP.NET Core中使用GraphQL - 目錄 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中介軟體 ASP.NET Core中使用GraphQL - 第三章 依賴注入 ASP.NE

乾貨分享ASP.NET COREC#與Spring Boot MVC(JAVA)異曲同工的程式設計方式總結

目錄 C# VS JAVA 基礎語法類比篇: 一、匿名類 二、型別初始化 三、委託(方法引用) 四、Lambda表示式 五、泛型 六、自動釋放

Asp.net core 專案實戰 新聞網站+後臺 原始碼、設計原理 、視訊教程

首先說明,視訊教程、原始碼並非本人原創 本人將專案分割開,並寫了一些說明。 該視訊教程 地址  https://study.163.com/course/courseMain.htm?courseId=1005955006 原作者 筆者正在學 ASP.NET Core ,發現這

ASP.NET Core中使用GraphQL - 依賴注入

ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中介軟體 SOLID原則中的D表示依賴倒置原則。這個原則的內容是: 上層模組不應

ASP.NET Core中使用GraphQL - 欄位, 引數, 變數

ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中介軟體 ASP.NET Core中使用GraphQL - 第三章 依賴注入 ASP.NET Cor

Asp.net WebApi 專案示例增刪改查

1.WebApi是什麼        ASP.NET Web API 是一種框架,用於輕鬆構建可以由多種客戶端(包括瀏覽器和移動裝置)訪問的 HTTP 服務。ASP.NET Web API 是一種用於在 .NET Framework 上構建 RESTful