【無私分享:ASP.NET CORE 項目實戰(第七章)】文件操作 FileHelper

来源:http://www.cnblogs.com/yuangang/archive/2016/08/08/5743660.html
-Advertisement-
Play Games

目錄索引 【無私分享:ASP.NET CORE 項目實戰】目錄索引 簡介 在程式設計中,我們很多情況下,會用到對文件的操作,在 上一個系列 中,我們有很多文件基本操作的示例,在Core中有一些改變,主要是我們常用的Server.MapPath()不存在了,不知道後續的版本會不會有,在這裡,我們只能自 ...


 

目錄索引 

 

【無私分享: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 類里 有個讀取文件內容的方法調用這個方法獲取絕對路徑,在兩種情況下,構造器的註入顯然是不合適的

 因此,我們如何去實現呢?

一:我們添加兩個靜態類 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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...