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