天天看點

小議DirectoryInfo和FileInfo的用法

通俗來講,DirectoryInfo和FileInfo類是Directory類和File類功能的鏡像。

這兩個對象能使周遊檔案和目錄的關系變得更加簡單。例如,你可以很友善地獲得由DirectoryInfo對象代表的目錄内的檔案的FileInfo對象。

要注意的是Directory類和File類隻是提供了方法,而DirectoryInfo和FileInfo同時提供了方法和屬性。例如:File類有單獨的GetAttributes()方法和SetAttribute()方法,而FileInfo類提供了可讀寫的Attribute屬性。

關于DirectoryInfo類和FileInfo類的另外一個好處是它們共享一組屬性和方法,因為它們都是繼承自FileSystemInfo基類,此外,FileInfo和DirectoryInfo類各自有幾個獨有的成員(具體方法和屬性參見msdn)。

建立DirectoryInfo對象和FileInfo對象時,要在構造函數中指定完整的路徑。如下所示:

DirectoryInfo directoryInfo = new DirectoryInfo(@"c:/Temp");

FileInfo fileInfo = new FileInfo(@"c:/Temp/readme.txt");

      建立FileInfo和DirectoryInfo對象時,如果指定的路徑格式不正确(如包含非法字元)會得到一個異常。不過,路徑不需要對應真實的實體檔案或目錄。如果你不确信,可以用Exists檢查檔案或目錄是否确實存在。

      如果目錄或檔案不存在,可以用Create()方法建立它們,下面是一個示例:

    // Define the new directory and file.

    DirectoryInfo directoryInfo = new DirectoryInfo(@"c:/Temp/Test");

    FileInfo fileInfo = new FileInfo(@"c:/Temp/Test/readme.txt");

    // Now create them. Order here is important.

    // You can't create a file in a directory that doesn't exist yet.

    directoryInfo.Create();

    FileStream stream = fileInfo.Create();

    stream.Close();

DirectoryInfo對象和FileInfo對象在你第一次查詢某個屬性時擷取來自檔案系統的資訊,在後繼的使用中它們不再檢查新的資訊。如果檔案此時發生了變化,這會導緻不一緻性,如果你知道或者懷疑指定對象的檔案系統資訊被改變了,你可以調用Refresh方法擷取最新的資訊。

DirectoryInfo類沒有提供任何擷取目錄大小的屬性,不過,你可以累加某一特定目錄中每個檔案的FileInfo.Length基值來計算該目錄的大小。

在執行這一步前,你需要确定是否包含該子目錄的大小。下面的方法允許你是用這兩種方式中的任意一種:

    private static long CalculateDirectorySize(DirectoryInfo directory,

    bool includeSubdirectories)

    {

    long totalSize = 0;

    // Add up each file.

    FileInfo[] files = directory.GetFiles();

    foreach (FileInfo file in files)

    {

    totalSize += file.Length;

    }

    // Add up each subdirectory, if required.

    if (includeSubdirectories)

    {

    DirectoryInfo[] dirs = directory.GetDirectories();

    foreach (DirectoryInfo dir in dirs)

    {

    totalSize += CalculateDirectorySize(dir, true);

    }

    }

    return totalSize;

    }

關于剩餘空間的資訊,需要借助于DriveInfo類。     

使用Attributes

      FileInfo和DirectoryInfo類的Attributes屬性代表檔案或目錄的檔案系統特性。因為每個檔案和目錄都可以有一組屬性。Attributes屬性包含一組FileAttributes枚舉值(具體見msdn)。

要找出檔案的所有屬性,可以調用Attributes屬性的ToString()方法,它傳回一個逗号分割的特性清單字元串:

    // This displays a string in the format "ReadOnly, Archive, Encrypted"

    lblInfo.Text = fileInfo.Attributes.ToString();

測試單個特性時,需要使用位計算,例如考慮下面這段錯誤的代碼:

    if (fileInfo.Attributes == FileAttributes.ReadOnly)

    {  }

測試僅在目前檔案隻含有隻讀特性時才成功。這種情形很少見。如果需要正确檢測檔案是否錯誤,隻需要下面代碼:

    if ((fileInfo.Attributes & FileAttributes.ReadOnly) != 0)

    {  }

這個測試成功了,因為它隻過濾隻讀特性。

類似的邏輯允許你驗證檔案不具備某個特定的特性:

    if ((fileInfo.Attributes & FileAttributes.ReadOnly) != 0)

    {  }

你還必須用位運算來設定特性。此時,要小心不經意間删除檔案原先設定的特性:

    // This sets the read-only attribute (and keeps all others as is).

    fileInfo.Attributes = fileInfo.Attributes | FileAttributes.ReadOnly;

    // This removes the read-only attribute (and keeps all others as is).

    fileInfo.Attributes = fileInfo.Attributes & ~FileAttributes.ReadOnly;

某些特性不能通過程式設計來設定。例如Encrpted特性隻有你在Windows中使用EFS(加密檔案系統)時才會由作業系統設定