以 .NET 處理檔案路徑

已完成

.NET 具有可處理檔案系統路徑的內建機制。

在上一個練習中,沒有太多資料夾需要剖析。 如果您的檔案系統有許多檔案和資料夾,則手動建置路徑會是相當繁瑣的過程。 幸好,.NET 提供了一些內建的常數與公用程式函式,可讓您更方便地處理檔案路徑。

在這裡,您會了解 System.IO 命名空間與 System.Environment 類型中的一些常數與公用程式函式,來使程式變得更加聰明且更具復原性。

判斷目前的目錄

有時候,您不知道程式應該在哪一個目錄或路徑中執行。 讓我們這麼假設,您希望程式使用目前的目錄,但您不知道路徑為何。

.NET 會透過 Directory.GetCurrentDirectory 方法公開目前目錄的完整路徑。

Console.WriteLine(Directory.GetCurrentDirectory());

如果您從下列結構中的 201 資料夾執行上述程式碼,則 Directory.GetCurrentDirectory() 會傳回 stores\201

📂 stores
    📂 201

處理特殊目錄

.NET 可在任何地方執行:在 Windows 上、macOS 上、Linux 上,甚至是在 iOS 和 Android 等行動裝置作業系統上。 每個作業系統可能或可能沒有特殊系統資料夾的概念。 例如,主目錄,專用於使用者特定的檔案,或者桌面目錄,或是用於儲存暫存檔案的目錄。

這些類型的特殊目錄會隨作業系統而異。 想要記住每個作業系統的目錄結構,並根據目前的 OS 執行切換,將會是很麻煩的工作。

System.Environment.SpecialFolder 列舉會指定常數,用來擷取特殊系統資料夾的路徑。

下列程式碼會傳回任何作業系統中,等同於 Windows My Documents 資料夾或使用者 HOME 目錄的路徑 (即使程式碼是在 Linux 上執行也一樣):

string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

使用路徑

路徑是經常出現的主體,.NET 包含稱為 Path 的類別,專門用來處理路徑。

Path 類別位於 .NET 的 System.IO 命名空間中,因此不需要另行安裝。

特殊路徑字元

不同作業系統會使用不同的字元來分隔目錄層級。

例如,Windows 使用反斜線 (stores\201),而 macOS 使用正斜線 (stores/201)。

為了協助您使用正確的字元,Path 類別包含 DirectorySeparatorChar 欄位。

需要手動建置路徑時,.NET 會自動將該欄位解譯為該作業系統適用的分隔符號字元。

Console.WriteLine($"stores{Path.DirectorySeparatorChar}201");

// returns:
// stores\201 on Windows
//
// stores/201 on macOS

聯結路徑

Path 類別可處理單純為字串的檔案與資料夾路徑概念。 您可以使用 Path 類別來自動地針對特定作業系統建置正確的路徑。

例如,如果想要取得 stores/201 資料夾的路徑,即可使用 Path.Combine 函式來執行此作業。

Console.WriteLine(Path.Combine("stores","201")); // outputs: stores/201

請記住,您之所以會使用 Path.CombinePath.DirectorySeparatorChar 類別而不是將字串寫入程式碼,是因為程式可能會在許多不同的作業系統上執行。 Path 類別都能夠為執行的作業系統正確地設定的路徑格式。

提示

Path 類別無法判斷內容是否實際存在。 路徑是概念性的存在,而非實際存在,此類別會為您建置和剖析字串。

判斷副檔名

您也可以從 Path 類別判斷檔案的副檔名。 如果想要知道某個檔案是否為 JSON 檔案,則可使用 Path.GetExtension 函式。

Console.WriteLine(Path.GetExtension("sales.json")); // outputs: .json

取得了解檔案或路徑所需的所有資訊

Path 類別包含許多不同的方法,這些方法可執行各種動作。 您可分別使用 DirectoryInfoFileInfo 類別,以取得目錄或檔案的最多相關資訊。

string fileName = $"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales{Path.DirectorySeparatorChar}sales.json";

FileInfo info = new FileInfo(fileName);

Console.WriteLine($"Full Name: {info.FullName}{Environment.NewLine}Directory: {info.Directory}{Environment.NewLine}Extension: {info.Extension}{Environment.NewLine}Create Date: {info.CreationTime}"); // And many more

PathDirectoryInfoFileInfo 類別中還有許多實用的屬性和公用程式方法,但是這些核心概念可能是您最常使用的概念。 在下一個練習中,您將撰寫路徑及識別 .json 檔案。