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"};
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已經介紹完畢。接下來將為大家演示各種流的使用,以及各種流的操作場景。

更多內容煩請關注我的博客《高先生小屋》

file


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM