天天看點

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

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

本篇繼續前兩篇内容,跟大家介紹一下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"};

// Windows系統下的執行結果

// d:archives2001mediaimages

// d:/archives/2001/mediaimages

//

// 類Unix系統的執行結果

// 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:DirectorySubDirectorytest.txt" ,傳回"C:DirectorySubDirectory",如果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:mydirmyfile.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,可能不是正确的值。

  1. 總結

    到目前為止,常用的檔案API已經介紹完畢。接下來将為大家示範各種流的使用,以及各種流的操作場景。

原文位址

https://www.cnblogs.com/c7jie/p/12820192.html

繼續閱讀