1. 程式人生 > >C# 基礎知識系列- 14 IO篇 檔案的操作

C# 基礎知識系列- 14 IO篇 檔案的操作

> 本篇繼續前兩篇內容,跟大家介紹一下Path類以及FileSystemInfo這個類的主要方法和屬性。 > > 上文提到,在《C# 基礎知識系列-IO篇》之檔案相關的內容完結之後,會帶領大家開發一個小工具-快速檢索檔案所在目錄。 ## 1.3. Path Path的中文名稱有路徑的意思,所以Path類就是路徑類,C#把Path設定為工具類,路徑的例項被區分為檔案和目錄了。以下是它的定義: ```c# public static class Path ``` 路徑是描述檔案和目錄的位置的字串,路徑並不一定指向硬碟上,換句話說就是路徑不一定是物理路徑也有可能是虛擬路徑或者網路路徑。在不同的作業系統和平臺上,路徑有著不同的表現,所以Path類是對不同平臺行為的統一抽象。具體的路徑表示需要參照具體的系統表示形式。 那麼我們先來看看Path為我們提供了哪些內容,讓我們一睹為快: ### 1.3.1 欄位 ```c# public static readonly char AltDirectorySeparatorChar; public static readonly char DirectorySeparatorChar; ``` 這兩個是特定系統下的目錄分隔符,其中AltDirectorySeparatorChar表示正斜線(/),DirectorySeparatorChar 表示反斜線(\)。為什麼說是特定系統下的目錄分隔符呢,因為Windows環境對兩種分隔符都支援,但是Unix和類Unix系統只支援 / 作為目錄分隔符。所以如果系統需要跨平臺支援,則最好使用 **AltDirectorySeparatorChar**作為目錄分隔符來使用。 ```c# public static readonly char PathSeparator; ``` 這個欄位返回在環境變數中分隔路徑字串的平臺特定的分隔符。Windows中返回一個分號(;),其他平臺可能會有不一樣的表現。 ```c# public static readonly char VolumeSeparatorChar; ``` 這個表示卷分隔符,是個很有意思的特定。對於Linux系統來說並沒有類似於Windows一樣的卷,所以該欄位會返回一個/ ,而Windows中例如: D:\Temp\ 這個目錄則會返回冒號(:)。 ### 1.3.2 方法 介紹完了欄位,我們來看看Path給我們提供了哪些方法吧。 先從最常用的說起吧: ```c# public static string Combine (params string[] paths); public static string Combine (string path1, string path2); public static string Combine (string path1, string path2, string path3); public static string Combine (string path1, string path2, string path3, string path4); ``` 這一組方法用來拼接路徑,除第一個引數外,每個引數都應當是相對於之前引數拼接結果路徑的相對路徑。如果後續出現了絕對路徑,那之前計算出的路徑資訊則會全部拋棄,重新計算。 以下是一個示例: ```c# string[] paths = {@"d:\archives", "2001", "media", "images"}; string fullPath = Path.Combine(paths); Console.WriteLine(fullPath); paths = new string[] {@"d:\archives\", @"2001\", "media", "images"}; fullPath = Path.Combine(paths); Console.WriteLine(fullPath); paths = new string[] {"d:/archives/", "2001/", "media", "images"}; fullPath = Path.Combine(paths); Console.WriteLine(fullPath); // Windows系統下的執行結果 // d:\archives\2001\media\images // d:\archives\2001\media\images // d:/archives/2001/media\images // // 類Unix系統的執行結果 // d:\archives/2001/media/images // d:\archives\/2001\/media/images // d:/archives/2001/media/images ``` 繼續下一個方法: ```c# public static string GetFullPath (string path, string basePath); public static string GetFullPath (string path); ``` 獲取相對路徑的絕對路徑,其中 path 是相對路徑,basePath是絕對路徑。如果指定basePath,則從basePath根據path計算全路徑。 ```c# public static string GetRelativePath (string relativeTo, string path); ``` 返回從一個路徑到另一個路徑的相對路徑,其中relativeTo是源路徑,path為目標路徑。其中relativeTo始終是目錄,或者被認為是目錄。 ```c# public static string GetDirectoryName (string path); ``` 返回路徑path裡的目錄資訊,例如:"C:\Directory\SubDirectory\test.txt" ,返回"C:\Directory\SubDirectory",如果path是目錄,則返回其上級目錄的路徑字串。 ```c# public static string Join (string path1, string path2, string path3, string path4); public static string Join (string path1, string path2, string path3); public static string Join (params string[] paths); ``` 與Combine方法差不多,不過Join方法是把所以引數均按照相對目錄來拼接。 說完了目錄的一些操作,我們看看Path對檔案路徑提供了哪些支援: ```c# public static string GetFileName (string path); ``` 獲取路徑裡的檔名,例如說:“C:\mydir\myfile.ext”,返回結果就是“myfile.ext”,也就是說這個方法會返回攜帶字尾名的檔名。因為檔名本身就包含字尾名。 ```c# public static string GetFileNameWithoutExtension (string path); ``` 返回不帶字尾名的檔名,與GetFileName類似,但是不好含檔案格式字尾。 ```c# public static bool HasExtension (string path); ``` 確定是否包含字尾名,也稱格式名或者副檔名。 ```c# public static string GetExtension (string path); ``` 返回所代表的檔案的字尾名。 ```c# public static string ChangeExtension (string path, string extension); ``` 修改檔案的字尾名。 這些是Path的常用方法,大家有個印象就好。 ## 1.3 FileSystemInfo 檔案系統資訊,這是FileInfo和DirectoryInfo的兩個類的基類,它定義了檔案系統中檔案和目錄共有的一些屬性和方法。接下來讓我們簡單看一看。 先來看一下類的宣告: ```c# public abstract class FileSystemInfo : MarshalByRefObject, System.Runtime.Serialization.ISerializable ``` 一個abstract類,這個標記意味著這個類是一個抽象類,抽象類不能直接例項化,所以我們可能不會自己去直接例項化一個FileSystemInfo了。 所以我們先略過FileSystemInfo的建構函式,直接看屬性和方法。 ```c# public System.IO.FileAttributes Attributes { get; set; } ``` 獲取或者設定當前檔案或目錄的特性,這個特性是一個列舉,而且是一個位標記的列舉型別。 | 名稱 | 值 | 含義 | | ----------------- | ------ | ------------------------------------------------------------ | | Archive | 32 | 此檔案標記為包含在增量備份操作中。 每當修改檔案時,Windows 會設定該屬性,並且在增量備份期間處理檔案時,備份軟體應進行清理該屬性。 | | Compressed | 2048 | 此檔案是壓縮檔案。 | | Device | 64 | 留待將來使用。 | | Directory | 16 | 此檔案是一個目錄。 `Directory` 在 Windows、Linux 和 macOS 上受支援。 | | Encrypted | 16384 | 此檔案或目錄已加密。 對於檔案來說,表示檔案中的所有資料都是加密的。 對於目錄來說,表示新建立的檔案和目錄在預設情況下是加密的。 | | Hidden | 2 | 檔案是隱藏的,因此沒有包括在普通的目錄列表中。 `Hidden` 在 Windows、Linux 和 macOS 上受支援。 | | IntegrityStream | 32768 | 檔案或目錄包括完整性支援資料。 在此值適用於檔案時,檔案中的所有資料流具有完整性支援。 此值將應用於一個目錄時,所有新檔案和子目錄在該目錄中和預設情況下應包括完整性支援。 | | Normal | 128 | 該檔案是沒有特殊屬性的標準檔案。 僅當其單獨使用時,此特性才有效。 `Normal` 在 Windows、Linux 和 macOS 上受支援。 | | NoScrubData | 131072 | 檔案或目錄從完整性掃描資料中排除。 此值將應用於一個目錄時,所有新檔案和子目錄在該目錄中和預設情況下應不包括資料完整性。 | | NotContentIndexed | 8192 | 將不會通過作業系統的內容索引服務來索引此檔案。 | | Offline | 4096 | 此檔案處於離線狀態, 檔案資料不能立即供使用。 | | ReadOnly | 1 | 檔案為只讀檔案。 `ReadOnly` 在 Windows、Linux 和 macOS 上受支援。 在 Linux 和 macOS 上,更改 `ReadOnly` 標記是許可權操作。 | | ReparsePoint | 1024 | 檔案包含一個重新分析點,它是一個與檔案或目錄關聯的使用者定義的資料塊。 `ReparsePoint` 在 Windows、Linux 和 macOS 上受支援。 | | SparseFile | 512 | 此檔案是稀疏檔案。 稀疏檔案一般是資料通常為零的大檔案。 | | System | 4 | 此檔案是系統檔案。 即,該檔案是作業系統的一部分或者由作業系統以獨佔方式使用。 | | Temporary | 256 | 檔案是臨時檔案。 臨時檔案包含當執行應用程式時需要的,但當應用程式完成後不需要的資料。 檔案系統嘗試將所有資料儲存在記憶體中,而不是將資料重新整理回大容量儲存,以便可以快速訪問。 當臨時檔案不再需要時,應用程式應立即刪除它。 | 通過以下方式進行判斷: ```c# FileSystemInfo fsi; bool isXXX = (fsi.Attributes & FileAttributes.XXX) == FileAttributes.XXX; ``` ```c# public DateTime CreationTime { get; set; } public DateTime CreationTimeUtc { get; set; } ``` 返回檔案/目錄的建立時間,其中UTC指協調世界時 。 ```c# public string Extension { get; } ``` 獲取檔案的檔案字尾名(副檔名),帶點號(.)。 ```c# public virtual string FullName { get; } public abstract string Name { get; } ``` 都是返回檔案或目錄的名稱,不過FullName返回的是全路徑名稱,Name只返回了檔名。 ```c# public DateTime LastAccessTime { get; set; } public DateTime LastAccessTimeUtc { get; set; } ``` 獲取或設定檔案最後一次訪問的時間,該屬性的返回值並不是嚴格意義上的最後一次訪問時間,因為部分系統不會及時更新。 ```c# public DateTime LastWriteTime { get; set; } public DateTime LastWriteTimeUtc { get; set; } ``` 最後一次修改時間,可以自己設定或修改,類似與LastAccessTime,可能不是正確的值。 # 2. 總結 到目前為止,常用的檔案API已經介紹完畢。接下來將為大家演示各種流的使用,以及各種流的操作場景。 > 更多內容煩請關注[我的部落格《高先生小屋》](https://blogs.attachie.club) ![file](https://img2020.cnblogs.com/other/1266612/202005/1266612-20200502231628047-1172999