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