微軟的.Net框架為我們提供了基于流的I/O操作方式,這樣就大大簡化了開發(fā)者的工作。因?yàn)槲覀兛梢詫σ幌盗械耐ㄓ脤ο筮M(jìn)行操作,而不必關(guān)心該I/O操作是和本機(jī)的文件有關(guān)還是和網(wǎng)絡(luò)中的數(shù)據(jù)有關(guān)。.Net框架主要為我們提供了一個System.IO命名空間,該命名空間基本包含了所有和I/O操作相關(guān)的類。
本文將向大家介紹一些基本的文件操作方法,包括對文件系統(tǒng)中的目錄和文件的操作,還有就是文件的讀寫操作等。通過運(yùn)用System.IO.DirectoryInfo類和System.IO.FileInfo類我們可以輕易的完成與目錄和文件相關(guān)的操作,而通過運(yùn)用System.IO.StreamReader類和System.IO.StreamWriter類我們可以方便的完成與文件的讀寫相關(guān)的操作。
命名空間概覽
下面的表格顯示了System.IO命名空間中最重要的一些類,通過運(yùn)用這些類我們就能完成基本的文件操作。
表1
類名 |
功能和用途 |
BinaryReader、BinaryWriter |
讀寫二進(jìn)制數(shù)據(jù) |
Directory、File、DirectoryInfo以及FileInfo |
創(chuàng)建、刪除并移動目錄和文件,通過屬性獲取特定目錄和文件的相關(guān)信息 |
FileStream |
以隨機(jī)方式訪問文件 |
MemoryStream |
訪問存儲在內(nèi)存中的數(shù)據(jù) |
StreamReader 、StreamWriter |
讀寫文本數(shù)據(jù)信息 |
StringReader、StringWriter |
運(yùn)用字符串緩沖讀寫文本數(shù)據(jù)信息 |
運(yùn)用DirectoryInfo類和FileInfo類
DirectoryInfo類和FileInfo類的基類都是FileSystemInfo類,這個類是一個抽象類,也就是說你不可以實(shí)例化該類,只能通過繼承產(chǎn)生其子類并實(shí)例化其子類。然而你卻可以運(yùn)用由該類定義的各種屬性,下面的表格顯示了該類已經(jīng)定義了的各種屬性。
表2
屬性 |
功能和用途 |
Attributes |
返回和文件相關(guān)的屬性值,運(yùn)用了FileAttributes枚舉類型值 |
CreationTime |
返回文件的創(chuàng)建時間 |
Exists |
檢查文件是否存在于給定的目錄中 |
Extension |
返回文件的擴(kuò)展名 |
LastAccessTime |
返回文件的上次訪問時間 |
FullName |
返回文件的絕對路徑 |
LastWriteTime |
返回文件的上次寫操作時間 |
Name |
返回給定文件的文件名 |
Delete() |
刪除一個文件的方法,請務(wù)必謹(jǐn)慎地運(yùn)用該方法 |
DirectoryInfo類提供了創(chuàng)建、刪除和移動目錄等方法,要運(yùn)用表2中的各種屬性,我們首先得創(chuàng)建一個DirectoryInfo類的對象,然后就可以訪問其各種屬性了。
DirectoryInfo dir1 = new DirectoryInfo(@"F:\Test");
Console.WriteLine("Full Name is : {0}", dir1.FullName);
Console.WriteLine("Attributes are : {0}", dir1.Attributes.ToString());
|
同時,我們還可以運(yùn)用FileAttributes枚舉類型值來獲取和文件相關(guān)的各種屬性,下面的表格就顯示了該枚舉類型中的各種值。
表3
值 |
功能和用途 |
Archive |
返回文件的存檔狀態(tài) |
Compressed |
返回文件是否被壓縮 |
Directory |
返回文件是否是一個目錄 |
Encrypted |
返回文件是否被加密 |
Hidden |
返回文件是否是隱藏的 |
Offline |
表明文件數(shù)據(jù)是不可得的 |
ReadOnly |
表明文件是只讀的 |
System |
表明文件是一個系統(tǒng)文件 |
目錄下的文件操作
運(yùn)用DirectoryInfo類的對象我們可以輕松的實(shí)現(xiàn)對目錄以及和目錄中的文件相關(guān)的操作,假如你要獲得某個目錄F:\Pictures下的所有BMP文件,那么通過下面的代碼就可以實(shí)現(xiàn)該功能。
DirectoryInfo dir = new DirectoryInfo(@"F:\ Pictures");
FileInfo[] bmpfiles = dir.GetFiles("*.bmp);
Console.WriteLine("Total number of bmp files", bmpfiles.Length);
Foreach( FileInfo f in bmpfiles)
{
Console.WriteLine("Name is : {0}", f.Name);
Console.WriteLine("Length of the file is : {0}", f.Length);
Console.WriteLine("Creation time is : {0}", f.CreationTime);
Console.WriteLine("Attributes of the file are : {0}",
f.Attributes.ToString());
}
|
上面的代碼中我們首先創(chuàng)建了一個DirectoryInfo對象,然后通過調(diào)用該對象的GetFiles方法獲取目錄F:\Pictures下的所有以bmp為擴(kuò)展名的文件,該方法返回的值是一個FileInfo類型的數(shù)組,每個元素則代表一個文件。最后,程序還列舉了每個BMP文件的相關(guān)屬性。
創(chuàng)建子目錄
運(yùn)用DirectoryInfo類創(chuàng)建子目錄是非常容易的,你只要調(diào)用其中CreateSubdirectory()方法即可,演示代碼如下。
DirectoryInfo dir = new DirectoryInfo(@"F:\ Pictures");
try
{
dir.CreateSubdirectory("Sub");
dir.CreateSubdirectory(@"Sub\MySub");
}
catch(IOException e)
{
Console.WriteLine(e.Message);
}
|
運(yùn)用FileInfo類創(chuàng)建、刪除文件
通過FileInfo類,我們可以方便地創(chuàng)建出文件,并可以訪問文件的屬性同時還可以對文件進(jìn)行打開文件、關(guān)閉文件、讀寫文件等基本的操作。下面的代碼顯示了如何創(chuàng)建一個文本文件并且去訪問其創(chuàng)建時間、文件的絕對路徑以及文件屬性等文件信息,最后程序還給出了刪除文件的方法。
FileInfo fi = new FileInfo(@"F:\Myprogram.txt");
FileStream fs = fi.Create();
Console.WriteLine("Creation Time: {0}",fi.CreationTime);
Console.WriteLine("Full Name: {0}",fi.FullName);
Console.WriteLine("FileAttributes: {0}",fi.Attributes.ToString());
Console.WriteLine("Press any key to delete the file");
Console.Read();
fstr.Close();
fi.Delete();
|
理解FileInfo類的Open()方法
我們在對文件進(jìn)行讀寫操作之前必須打開文件,F(xiàn)ileInfo類為我們提供了一個Open()方法,該方法包含了兩個枚舉類型值的參數(shù),一個為FileMode枚舉類型值,另一個為FileAccess枚舉類型值。通過設(shè)定這兩個參數(shù)值,我們可以對文件的訪問模式和操作權(quán)限進(jìn)行控制。下面的兩個表格分別顯示了FileMode枚舉類型的值和FileAccess枚舉類型的值。
表4
值 |
功能和用途 |
Append |
打開文件并添加數(shù)據(jù),運(yùn)用該方法時FileAccess枚舉類型值應(yīng)為Write。 |
Create |
創(chuàng)建一個新文件,有可能會覆蓋已經(jīng)存在的文件。 |
CreateNew |
創(chuàng)建一個新文件,如果該文件已經(jīng)存在,則拋出IOException異常。 |
Open |
打開一個已經(jīng)存在的文件。 |
OpenOrCreate |
打開文件,如果該文件不存在,則創(chuàng)建之。 |
Truncate |
截短一個已經(jīng)存在的文件。 |
表5
值 |
功能和用途 |
Read |
可以從一個文件中讀取數(shù)據(jù)。 |
ReadWrite |
可以從一個文件中讀取數(shù)據(jù),同時還可以向文件中寫入數(shù)據(jù)。 |
Write |
可以向文件中寫入數(shù)據(jù)。 |
下面的代碼顯示了Open()方法的具體運(yùn)用方法。
FileInfo f = new FileInfo("F:\MyFile.txt");
FileStream s = f.Open(FileMode.OpenorWrite, FileAccess.Read);
|
運(yùn)用StreamReader類和StreamWriter類實(shí)現(xiàn)文件的讀寫操作
對文件的讀寫操作應(yīng)該是最重要的文件操作,System.IO命名空間為我們提供了諸多文件讀寫操作類,在這里我要向大家介紹最常用也是最基本的StreamReader類和StreamWriter類。從這兩個類的名稱我們不難發(fā)現(xiàn)它們都是基于流的讀寫操作類。
我們可以通過File類的OpenText()方法來獲取一個StreamReader對象,通過該對象我們可以實(shí)現(xiàn)對文本文件的讀操作,方法如下:
Console.WriteLine("Reading the contents from the file");
StreamReader s = File.OpenText("MyText.txt");
string read = null;
while ((read = s.ReadLine()) != null)
{
Console.WriteLine(read);
}
s.Close();
|
而通過調(diào)用FileInfo類的CreateText()方法我們可以獲取一個StreamWriter對象,調(diào)用StreamWriter類的WriteLine()我們就可以向文本文件中寫入數(shù)據(jù)了,方法如下:
FileInfo f = new FileInfo("MyText.txt")
StreamWriter w = f.CreateText();
w.WriteLine("This is from");
w.WriteLine("Chapter 1");
w.WriteLine("Of C# Module");
w.Write(w.NewLine);
w.WriteLine("Thanks for your time");
w.Close();
|
總結(jié)
以上我簡要地向大家介紹了C#文件操作的基本知識和方法,通過本文大家不難發(fā)現(xiàn).Net框架下I/O操作的方便性。讀者在學(xué)習(xí)了本文后,如果要進(jìn)行一些基本的文件操作,那么對于System.IO命名空間中的諸如DirectoryInfo類、FileInfo類、FileStream類、StreamReader類以及StreamWriter類等類一定得有基本了解并在實(shí)際應(yīng)用中靈活使用之。如果要對文件操作有更進(jìn)一步的控制,那么不妨去研究一下System.IO命名空間中的更為具體和細(xì)節(jié)的一些類。最后,希望本文對大家能有所幫助。
|