C# 對包含文件或目錄路徑信息的 System.String 實例執行操作


在字符串操作中有一類比較特殊的操作,就是對包含文件或目錄路徑信息的 System.String 實例執行操作。比如根據一個表示路徑的字符串獲取其代表的文件名稱、文件夾路徑、文件擴展名等。在很多時候,我們喜歡用substring加indexof來進行字符串的修改。代碼如下:

string filePath = @"C:\test\test2\test3.txt";

//通過substring加indexof方式獲取文件信息
string fileName = filePath.Substring(filePath.LastIndexOf('\\') + 1);

//通過substring加indexof方式獲取文件信息
string fileExtenstion = filePath.Substring(filePath.LastIndexOf('.') + 1);

//通過substring加indexof方式獲取文件信息
string fileNameWithOutExtenstion = filePath.Substring(
    filePath.LastIndexOf('\\') + 1,
    filePath.LastIndexOf('.') - filePath.LastIndexOf('\\') - 1);

上面這種做法前兩個還算比較好寫,只要注意下+1就行了,但是最后一個卻不是一下就能寫對的,我調了兩次才改對的。而且這種代碼的可閱讀性非常不好,不加注釋的話,新手很難一下看明白。下面是另一種寫法,主要運用FileInfo這個類。

var fileInfo = new FileInfo(filePath);
string name = fileInfo.Name;
string extens = fileInfo.Extension;
string nameWithOutExtenstion = name.Remove(name.IndexOf(".", StringComparison.Ordinal));

上面的代碼看起來要比最開始的substring+indexof方案閱讀性更好,而且寫的時候更靠譜,不用擔心出現像上面那種忘記“+1”的錯誤。但是存在如下問題:

1. 引入了FileInfo這個類,這是一個文件操作的類,僅僅為了獲取文件名稱等有些大材小用;
2. 還是沒法獲取不帶文件擴展名的文件名稱;

其實.Net 給我們提供了更好的解決方案,就是大家經常用到的Path類。完成上面功能的代碼如下:

string nameFromPath = Path.GetFileName(filePath);
string extenstionFromPath = Path.GetExtension(filePath);
string nameWithoutExtensionFromPath = Path.GetFileNameWithoutExtension(filePath);

上述代碼非常簡潔易懂,而且寫法高效,非常值得推薦。以下是Path的一些其它API:

//得到文件的目錄
string dirName = Path.GetDirectoryName(filePath);

//得到文件的全路徑
string fullPath = Path.GetFullPath(filePath);

// 獲取指定路徑的根目錄信息。
//如果 path 為 null,則為 null;
//如果 path 不包含根目錄信息(比如相對路徑),則為空。
string pathRoot = Path.GetPathRoot(filePath);

//得到隨機文件夾名或文件名,省得起名字了,但注意這個名字帶后綴。
string randomName = Path.GetRandomFileName();

// 返回當前用戶的臨時文件夾的路徑,以反斜杠結尾。
string tempPath = Path.GetTempPath();

//獲取包含不允許在文件名中使用的字符的數組,在寫界面的時候可以增加輸入合法性的判斷
char[] invalidFileName = Path.GetInvalidFileNameChars();

//獲取包含不允許在路徑名中使用的字符的數組
char[] invalidPathName = Path.GetInvalidPathChars();

//將字符串數組組合成一個路徑。(比以前好用多了,增加不定參數的支持)
string combinePath = Path.Combine(filePath1, filePath2, filePath3);

//獲取一個值,該值指示指定的路徑字符串是否包含根
bool isContainsRoot = Path.IsPathRooted(filePath);

除了上述方法之外,還提供了一些其它readonly的變量,在我們寫代碼的時候都可以拿來用。具體如下:

// 摘要: 
//     提供平台特定的替換字符,該替換字符用於在反映分層文件系統組織的路徑字符串中分隔目錄級別。
public static readonly char AltDirectorySeparatorChar;
//
// 摘要: 
//     提供平台特定的字符,該字符用於在反映分層文件系統組織的路徑字符串中分隔目錄級別。
public static readonly char DirectorySeparatorChar;
//
// 摘要: 
//     用於在環境變量中分隔路徑字符串的平台特定的分隔符。
public static readonly char PathSeparator;
//
// 摘要: 
//     提供平台特定的卷分隔符。
public static readonly char VolumeSeparatorChar;

總結

1. 如果已經提供了輪子,那我們就不要自己造輪子;
2. 如果提供了好幾種輪子,那我們需要挑安全、好用的輪子。


免責聲明!

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



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