本篇繼續前兩篇內容,跟大家介紹一下Path類以及FileSystemInfo這個類的主要方法和屬性,
上文提到,在《C# 基礎知識系列-IO篇》之檔案相關的內容完結之后,會帶領大家開發一個小工具-快速檢索檔案所在目錄,
1.3. Path
Path的中文名稱有路徑的意思,所以Path類就是路徑類,C#把Path設定為工具類,路徑的實體被區分為檔案和目錄了,以下是它的定義:
public static class Path
路徑是描述檔案和目錄的位置的字串,路徑并不一定指向硬碟上,換句話說就是路徑不一定是物理路徑也有可能是虛擬路徑或者網路路徑,在不同的作業系統和平臺上,路徑有著不同的表現,所以Path類是對不同平臺行為的統一抽象,具體的路徑表示需要參照具體的系統表示形式,
那么我們先來看看Path為我們提供了哪些內容,讓我們一睹為快:
1.3.1 欄位
public static readonly char AltDirectorySeparatorChar;
public static readonly char DirectorySeparatorChar;
這兩個是特定系統下的目錄分隔符,其中AltDirectorySeparatorChar表示正斜線(/),DirectorySeparatorChar 表示反斜線(\),為什么說是特定系統下的目錄分隔符呢,因為Windows環境對兩種分隔符都支持,但是Unix和類Unix系統只支持 / 作為目錄分隔符,所以如果系統需要跨平臺支持,則最好使用 AltDirectorySeparatorChar作為目錄分隔符來使用,
public static readonly char PathSeparator;
這個欄位回傳在環境變數中分隔路徑字串的平臺特定的分隔符,Windows中回傳一個分號(;),其他平臺可能會有不一樣的表現,
public static readonly char VolumeSeparatorChar;
這個表示卷分隔符,是個很有意思的特定,對于Linux系統來說并沒有類似于Windows一樣的卷,所以該欄位會回傳一個/ ,而Windows中例如:
D:\Temp\ 這個目錄則會回傳冒號(:),
1.3.2 方法
介紹完了欄位,我們來看看Path給我們提供了哪些方法吧,
先從最常用的說起吧:
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);
這一組方法用來拼接路徑,除第一個引數外,每個引數都應當是相對于之前引數拼接結果路徑的相對路徑,如果后續出現了絕對路徑,那之前計算出的路徑資訊則會全部拋棄,重新計算,
以下是一個示例:
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
繼續下一個方法:
public static string GetFullPath (string path, string basePath);
public static string GetFullPath (string path);
獲取相對路徑的絕對路徑,其中 path 是相對路徑,basePath是絕對路徑,如果指定basePath,則從basePath根據path計算全路徑,
public static string GetRelativePath (string relativeTo, string path);
回傳從一個路徑到另一個路徑的相對路徑,其中relativeTo是源路徑,path為目標路徑,其中relativeTo始終是目錄,或者被認為是目錄,
public static string GetDirectoryName (string path);
回傳路徑path里的目錄資訊,例如:"C:\Directory\SubDirectory\test.txt" ,回傳"C:\Directory\SubDirectory",如果path是目錄,則回傳其上級目錄的路徑字串,
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對檔案路徑提供了哪些支持:
public static string GetFileName (string path);
獲取路徑里的檔案名,例如說:“C:\mydir\myfile.ext”,回傳結果就是“myfile.ext”,也就是說這個方法會回傳攜帶后綴名的檔案名,因為檔案名本身就包含后綴名,
public static string GetFileNameWithoutExtension (string path);
回傳不帶后綴名的檔案名,與GetFileName類似,但是不好含檔案格式后綴,
public static bool HasExtension (string path);
確定是否包含后綴名,也稱格式名或者擴展名,
public static string GetExtension (string path);
回傳所代表的檔案的后綴名,
public static string ChangeExtension (string path, string extension);
修改檔案的后綴名,
這些是Path的常用方法,大家有個印象就好,
1.3 FileSystemInfo
檔案系統資訊,這是FileInfo和DirectoryInfo的兩個類的基類,它定義了檔案系統中檔案和目錄共有的一些屬性和方法,接下來讓我們簡單看一看,
先來看一下類的宣告:
public abstract class FileSystemInfo : MarshalByRefObject, System.Runtime.Serialization.ISerializable
一個abstract類,這個標記意味著這個類是一個抽象類,抽象類不能直接實體化,所以我們可能不會自己去直接實體化一個FileSystemInfo了,
所以我們先略過FileSystemInfo的建構式,直接看屬性和方法,
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 | 檔案是臨時檔案, 臨時檔案包含當執行應用程式時需要的,但當應用程式完成后不需要的資料, 檔案系統嘗試將所有資料保存在記憶體中,而不是將資料重繪回大容量存盤,以便可以快速訪問, 當臨時檔案不再需要時,應用程式應立即洗掉它, |
通過以下方式進行判斷:
FileSystemInfo fsi;
bool isXXX = (fsi.Attributes & FileAttributes.XXX) == FileAttributes.XXX;
public DateTime CreationTime { get; set; }
public DateTime CreationTimeUtc { get; set; }
回傳檔案/目錄的創建時間,其中UTC指協調世界時 ,
public string Extension { get; }
獲取檔案的檔案后綴名(擴展名),帶點號(.),
public virtual string FullName { get; }
public abstract string Name { get; }
都是回傳檔案或目錄的名稱,不過FullName回傳的是全路徑名稱,Name只回傳了檔案名,
public DateTime LastAccessTime { get; set; }
public DateTime LastAccessTimeUtc { get; set; }
獲取或設定檔案最后一次訪問的時間,該屬性的回傳值并不是嚴格意義上的最后一次訪問時間,因為部分系統不會及時更新,
public DateTime LastWriteTime { get; set; }
public DateTime LastWriteTimeUtc { get; set; }
最后一次修改時間,可以自己設定或修改,類似與LastAccessTime,可能不是正確的值,
2. 總結
到目前為止,常用的檔案API已經介紹完畢,接下來將為大家演示各種流的使用,以及各種流的操作場景,
更多內容煩請關注我的博客《高先生小屋》

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/44855.html
標籤:C#
上一篇:面向介面編程,你考慮過性能嗎?
下一篇:第1課 課程介紹
