C#之IO類庫(一)——操作文件系統


C#的IO類庫提供了豐富的IO操作,下面我來總結一下其IO類庫提供的一些操作文件系統的方法

一.操作驅動器
C#用DriveInfo來操作驅動器
1.創建對象
a.我們可以通過靜態方法DriveInfo.GetDrives()來獲取所有的Driver。
b.可以以Drive Letter為參數新建DriveInfo對象,注意DNS路徑不能作為參數。
c.此外,我們還可以通過Directory.GetLogicalDrives()先獲取機器上所有Driver的Driver letter,再用它新建DriveInfo對象以操作所有的Driver。

2.獲取驅動器的狀態
我們通過DriveInfo對象來獲取驅動器的狀態,可以獲取的狀態有
AvailableFreeSpace:獲取當前用戶被分配的可用空間大小(bytes)
TotalFreeSpace:獲取所有可用空間大小(bytes)
TotalSize:獲取總大小(bytes)
DriveFormat:返回FAT, NTFS等值
DriveType:返回DriveType類型的Enum值,可以是CDRom, Fixed, Network, NoRootDirectory, Ram, Removable,或者Unknown
IsReady:對Removable和CD-ROM來說只有相應的設備可以訪問了才返回true,當該屬性為false時,很多其他屬性無法獲取
Name:盤符名
RootDirectory:返回Driver所代表的路徑的Directory對象。
VolumeLabel:返回VolumeLabel信息,VolumeLabel就是咱自己對盤符定義的名字

二.操作文件夾
C#提供了DirectoryInfo和Directory兩個類來操作文件夾,這兩個類提供了很多相同的方法,他們的區別在於DirectoryInfo是先構造一個文件夾對象,再對這個對象進行操作。而Directory提供的大多數都是靜態函數,這樣能夠直接根據給定的文件夾路徑進行相應的操作。在對文件夾進行多個操作時最好用DirectoryInfo,而只進行一個操作,最好用Directory。
1.構造對象
DirectoryInfo需要先構造文件夾對象,再獲取文件夾屬性,或者對文件夾進行操作。它的構造方法不負責判斷路徑是否存在。
Directory不需要構造文件夾對象,直接傳入文件夾的路徑進行操作

2.判斷文件夾是否存在
DirectoryInfo對象可通過查看Exists屬性查看文件夾是否存在
Directory可通過Exists方法查看文件夾是否存在

3.獲取文件夾屬性
注意,在用DirectoryInfo和Directory類獲取文件夾屬性前最好先判斷其是否存在
對DirectoryInfo對象,在獲取文件夾屬性前應先用refresh函數刷新,可以訪問文件夾的下列屬性:
Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值
CreationTime
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc

Directory也可獲取上述屬性,不過是用靜態函數獲取,另外Directory也不支持獲取Attribute。
SetCreationTime
SetCreationTimeUtc
SetLastAccessTime
SetLastAccessTimeUtc
SetLastWriteTime
SetLastWriteTimeUtc
GetCreationTime
GetCreationTimeUtc
GetLastAccessTime
GetLastAccessTimeUtc
GetLastWriteTime
GetLastWriteTimeUtc

4.路徑操作
DirectoryInfo和Directory類都支持路徑操作,這些操作只針對傳入的路徑字符串,和文件夾是否存在無關
DirectoryInfo有下面一些屬性
Name
Extension
FullName
Parent
Root

Directory有下面一些方法
GetParent:獲取父目錄的DirectoryInfo對象
GetDirectoryRoot

5.新建,移動,刪除文件夾
DirectoryInfo和Directory類都支持文件夾的新建,移動,刪除
DirectoryInfo的方法
Create,CreateSubdirectory,Delete,MoveTo

Directory的方法
CreateDirectory
Delete  
Move

6.遍歷文件夾下的內容
DirectoryInfo和Directory類都支持遍歷文件夾下的內容,而且都支持通過傳入searchpattern和searchOption來定義遍歷的行為,對於searchpattern,*匹配一個或多個字符,?匹配一個字符。searchOption的值是TopDirectory或AllDirectories,用來控制匹配的時候要不要包括子目錄。
DirectoryInfo的方法:
EnumerateDirectories
EnumerateFiles
EnumerateFileSystemInfos
GetDirectories
GetFiles
GetFileSystemInfos

Directory的方法
GetDirectories
GetFiles
GetFileSystemEntries
EnumerateDirectories
EnumerateFiles
EnumerateFileSystemEntries

7.獲取和設置當前的工作路徑
Directory有兩個重要的方法:
GetCurrentDirectory:獲取當前的工作路徑
SetCurrentDirectory:設置當前的工作路徑

三.操作文件
C#提供了FileInfo和File兩個類來操作文件,這兩個類提供了很多相同的方法,他們的區別在於FileInfo是先構造一個文件對象,再對這個對象進行操作。而File提供的大多數都是靜態函數,這樣能夠直接根據給定的文件路徑進行相應的操作。在對文件進行多個操作時最好用FileInfo,而只進行一個操作,最好用File。
1.構造對象
FileInfo需要先構造文件對象,再獲取文件屬性,或者對文件進行操作。它的構造方法不負責判斷路徑是否存在。
File不需要構造文件對象,直接傳入文件的路徑進行操作

2.判斷文件是否存在
FileInfo對象可通過查看Exists屬性查看文件是否存在
File可通過Exists方法查看文件是否存在

3.獲取文件屬性
注意,在用FileInfo和File類獲取文件屬性前最好先判斷其是否存在
對FileInfo對象,在獲取文件屬性前應先用refresh函數刷新,可以訪問文件的下列屬性:
Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值
CreationTime
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc
Length:文件大小
IsReadOnly


File也可獲取上述屬性,不過是用靜態函數獲取
GetAttributes
SetAttributes
SetCreationTime
SetCreationTimeUtc
SetLastAccessTime
SetLastAccessTimeUtc
SetLastWriteTime
SetLastWriteTimeUtc
GetCreationTime
GetCreationTimeUtc
GetLastAccessTime
GetLastAccessTimeUtc
GetLastWriteTime
GetLastWriteTimeUtc

4.路徑操作
FileInfo提供了一些路徑操作,這些操作只針對傳入的路徑字符串,和文件是否存在無關
FileInfo有下面一些屬性
Name
Extension
FullName
Directory:返回DirectoryInfo對象
DirectoryName
Parent
Root

5.新建,移動,刪除文件
FileInfo和File類都提供了新建,移動,刪除文件操作
FileInfo的方法:
CopyTo
Create
Delete
MoveTo
Replace

File的方法
Copy
Create
Delete
Move
Replace

6.加密解密文件
FileInfo和File類都提供了Encrypt和Decrypt方法用來加密和解密文件,用某個用戶加密的文件只有同一個用戶能解密

四.監聽文件夾
C#有個很有趣的類,FileSystemWatcher,這個類可以用來監聽文件夾內文件的增加,刪除,修改等事件。
1.定制監聽的信息
通過設置FileSystemWatcher的一些屬性來定制監聽的信息
Path:監聽的目錄
NotifyFilter:用來設置對哪些類型的更改進行監視
監視的類型為FileName,DirectoryName,Attributes,Size,LastWrite,LastAccess,CreationTime,Security的或值。默認為LastWrite, FileName, DirectoryName的或值
InternalBufferSize:內部緩存區的大小,默認8KB,最小4KB,最大64KB
Filter:可以用通配符過濾文件,*匹配一個或多個字符,?匹配一個字符
IncludeSubdirectories:是否監聽子目錄

2.定制事件發生后的行為
文件夾里會發生下述事件
Changed
Created
Deleted
Renamed
我們通過給這些事件加事件處理器來處理事件
另外還可以用WaitForChanged來監聽某個指定類型的消息然后返回

3.啟動監聽
只有當EnableRaisingEvents為true且Path有值時,才能監聽成功,當我們將所有信息設置好后,就可以通過設置這個值啟動和停止監聽了

4.用BeginInit和EndInit來阻止component在初始化完成前使用,一般將一系列的操作寫在這兩個函數之間。

5.在Form中定義的時候必須將Form控件賦給SynchronizingObject屬性

6.簡單的示例:

監聽"C:\jingle"文件夾下面所有文件和文件夾的重命名操作

 [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = "c:\\jingle";
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.IncludeSubdirectories = true;
        watcher.Filter = "*.*";

        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        watcher.EnableRaisingEvents = true;

        Console.Read();
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }

 


免責聲明!

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



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