本文主要講解一下在文件的讀取中,StreamWriter、StreamReader和FileStream分別有什么樣的不同,廢話(huà)少說(shuō),直接進(jìn)入主題。
下面是關(guān)于StreadReader的使用例子。
完整代碼如下:
引入命名空間:
using System.IO;
完整代碼:
namespace StreamReaderApp { class Program { static void Main(string[] args) { string s = ""; using (StreamReader sr = new StreamReader("c:\\file1.txt")) { s = sr.ReadToEnd(); } Console.WriteLine(s); Console.ReadLine(); } } }
一、StreamReader類(lèi)的介紹
構(gòu)造函數(shù):
StreamReader sw = new StreamReader(Stream stream); StreamReader sw = new StreamReader(string path);
為指定的流/文件名初始化 StreamReader 類(lèi)的新實(shí)例,并且使用默認(rèn)的編碼(UTF-8)讀取文件。默認(rèn)的編碼方式是UTF-8,Encoding.Default表示的編碼方式也是UTF-8
StreamReader sw = new StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks); StreamReader sw = new StreamReader(string path, bool detectEncodingFromByteOrderMarks);
用指定的字節(jié)順序(BOM)標(biāo)記檢測(cè)選項(xiàng),為指定的流/文件名初始化 StreamReader 類(lèi)的一個(gè)新實(shí)例。其中detectEncodingFromByteOrderMarks是用來(lái)表示是否自動(dòng)探測(cè)BOM(文件前端標(biāo)識(shí)文字編碼的字節(jié))。
StreamReader sw = new StreamReader(Stream stream, Encoding encoding); StreamReader sw = new StreamReader(string path, Encoding encoding);
用指定的字符編碼為指定的流/文件名初始化 StreamReader 類(lèi)的一個(gè)新實(shí)例,因?yàn)橛行┚幋a(如GB2312、UTF7)就沒(méi)有BOM,就認(rèn)不到編碼,就需要手動(dòng)指定一個(gè)編碼。
StreamReader sw = new StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks); StreamReader sw = new StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks);
為指定的流/文件名初始化 StreamReader 類(lèi)的新實(shí)例,帶有指定的字符編碼和字節(jié)順序標(biāo)記檢測(cè)選項(xiàng)。
StreamReader sw = new StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks, int bufferSize); StreamReader sw = new StreamReader(string path, bool detectEncodingFromByteOrderMarks, int bufferSize);
為指定的流/文件名初始化 StreamReader 類(lèi)的新實(shí)例,帶有指定的字符編碼、字節(jié)順序標(biāo)記檢測(cè)選項(xiàng)和緩沖區(qū)大小。
常用方法及屬性:
Read() // 單字符讀入(文件指針不移動(dòng))
1、public override int Read(); //讀取輸入流中的下一個(gè)字符并使該字符的位置提升一個(gè)字符,返回的是字符的十進(jìn)制值。
StreamReader sr = new StreamReader(@"D:\Readme.txt", Encoding.GetEncoding("GB2312")); //通常需要轉(zhuǎn)碼為GB2312 int Ichar = 0; while ((Ichar = sr.Read()) != -1) // 不再有可用的字符,則為 -1 { MessageBox.Show(Convert.ToChar(Ichar).ToString()); //將int類(lèi)型轉(zhuǎn)成ASCII字符 }
2、public override int Read(char[] buffer, int index, int count); //從當(dāng)前流中將最多的 count 個(gè)字符讀入到buffer數(shù)組中,從buffer數(shù)組從index位開(kāi)始寫(xiě)入,返回值為讀取
的字符總數(shù)。
char[] buffer = new char[512]; int readCount = sr.Read(buffer, 0, 512); for (int i = 0; i<readCount; i++) { MessageBox.Show(buffer[i].ToString()); }
ReadLine() // 行讀入
方法原型:public override string ReadLine() // 輸入流中的下一行;如果到達(dá)了輸入流的末尾,則為空引用
string strLine = null; while ((strLine = sr.ReadLine()) != null) { MessageBox.Show(strLine); }
ReadToEnd() // 從流的當(dāng)前位置到末尾讀取流。
方法原型:public override string ReadToEnd(); // 如果當(dāng)前位置位于流的末尾,則返回空字符串 ("")。
備注:用該方法可以把數(shù)據(jù)流一次性全部加載到內(nèi)存中,內(nèi)存中數(shù)據(jù)的操作的速度是非??斓?,但要注意的是,如果文件太大的話(huà),可能內(nèi)存會(huì)不夠,就用Read或ReadLine()方法讀取。
string strLine = sr.ReadToEnd(); MessageBox.Show(strLine);
Peek() //讀取下 一個(gè)字符,但位置不移動(dòng)
方法原型:public override int Peek()
while (sr.Peek() != -1) { MessageBox.Show(sr.ReadLine()); }
EndOfStream // 獲取一個(gè)值,該值表示當(dāng)前的流位置是否在流的末尾
while (!sr.EndOfStream) { MessageBox.Show(sr.ReadLine()); }
CurrentEncoding // 獲取當(dāng)前 StreamReader 對(duì)象正在使用的當(dāng)前字符編碼
MessageBox.Show(sr.CurrentEncoding.EncodingName);
BaseStream // 返回基礎(chǔ)流
二、StreamWriter類(lèi)的介紹
構(gòu)造函數(shù):
StreamWriter sw = new StreamWriter(Stream stream); StreamWriter sw = new StreamWriter(string path);
用UTF-8編碼及默認(rèn)緩沖區(qū)大小,為指定的流/文件初始化StreamWriter類(lèi)的一個(gè)新實(shí)例。
StreamWriter sw = new StreamWriter(Stream stream,Encoding encoding);
用指定的編碼及默認(rèn)緩沖區(qū)大小,為指定的流初始化StreamWriter類(lèi)的新實(shí)例。(默認(rèn)寫(xiě)入編碼為UTF8)
StreamWriter sw = new StreamWriter(string path, bool append);
使用默認(rèn)編碼和緩沖區(qū)大小,為指定路徑上的指定文件初始化 StreamWriter 類(lèi)的新實(shí)例。true表示如果該文件存在,則可以向其追加。false表示將其全部重寫(xiě)。如果該文件
不存在,則此構(gòu)造函數(shù)將創(chuàng)建一個(gè)新文件。
StreamWriter sw = new StreamWriter(Stream stream,Encoding encoding,int bufferSize);
用指定的編碼及緩沖區(qū)大小,為指定的流初始化 StreamWriter 類(lèi)的新實(shí)例。int為緩沖區(qū)大小
StreamWriter sw = new StreamWriter(string path, bool append,Encoding encoding);
使用指定編碼和默認(rèn)緩沖區(qū)大小,為指定路徑上的指定文件初始化 StreamWriter 類(lèi)的新實(shí)例。true表示如果該文件存在, 則可以向其追加。false表示將其全部重寫(xiě)。如果該文件不存在,則此構(gòu)造函數(shù)將創(chuàng)建一個(gè)新文件。
StreamWriter sw = new StreamWriter(string path,bool append,Encoding encoding,int bufferSize);
使用指定編碼和緩沖區(qū)大小,為指定路徑上的指定文件初始化 StreamWriter 類(lèi)的新實(shí)例。true表示如果該文件存在,則可以向其追加。false表示將其全部重寫(xiě)。如果該文件不存在,則此構(gòu)造函數(shù)將創(chuàng)建一個(gè)新文件。
常用方法及屬性:
Write() // 寫(xiě)入流。(該方法有17種重載方法,就不一一解說(shuō),講幾個(gè)常用的方法)
1、public override void Write(string value) //將字符串寫(xiě)入流。
StreamWriter sw = new StreamWriter(@"D:\a.txt", true); //true表示如果a.txt文件已存在,則以追加的方式寫(xiě)入 sw.Write(this.textBox1.Text); sw.Close();
2、public override void Write(char value) // 按字符寫(xiě)入
char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'f' }; for (int i = 0; i<charArray.Length; i++) { sw.Write(charArray[i]); }
3、public override void Write(char[] buffer) // 按字符數(shù)組寫(xiě)入
char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'g' }; sw.Write(charArray);
4、public virtual void Write(string format, params Object[] arg) //按指定格式轉(zhuǎn)換的字符串寫(xiě)入
sw.Write("我的期待月薪為{0,9:C4},實(shí)現(xiàn)年齡為{1,9},成功率{2,9:P2}", new Object[]{ 20000, 30, 1 });
運(yùn)行結(jié)果:我的期待月薪為¥20,000.0000,實(shí)現(xiàn)年齡為 30,成功率 100.00% ,具體請(qǐng)參考stringFormat語(yǔ)法
5 、public override void Write(char[] buffer, int index, int count) // 從buffer數(shù)組的第index開(kāi)始寫(xiě)入count個(gè)字符
char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; sw.Write(charArray , 3, 4); 運(yùn)行結(jié)果:defg
WriteLine() // 寫(xiě)入流,后跟行結(jié)束符(行結(jié)束符樣式可用NewLine屬性設(shè)置)。(該方法有18種重載方法,只講常用的)
1、public virtual void WriteLine() //寫(xiě)入空行,等同于跳到下一行
sw.WriteLine();
2、public virtual void WriteLine(char value)
3、public virtual void WriteLine(char[] buffer)
4、public virtual void WriteLine(string value)
5、public virtual void WriteLine(string format, params Object[] arg)
6、public virtual void WriteLine(char[] buffer, int index, int count)
7、public virtual void WriteLine(Object value)
Flush // 清理當(dāng)前編寫(xiě)器的所有緩沖區(qū),并使所有緩沖數(shù)據(jù)寫(xiě)入基礎(chǔ)流。
方法原型:public override void Flush()
屬性:
AutoFlush // 設(shè)置StreamWriter 是否在每次調(diào)用 StreamWriter.Write 之后,將其緩沖區(qū)刷新到基礎(chǔ)流。
備注:除非我們顯示地調(diào)用Flush 或 Close,否則,刷新流不會(huì)刷新其基礎(chǔ)編碼器,也就是不會(huì)寫(xiě)入到硬盤(pán)中,將 AutoFlush 設(shè)置為 true后只要調(diào)用write()方法會(huì)
自動(dòng)將數(shù)據(jù)寫(xiě)入到硬盤(pán)中,如果用戶(hù)期望您所寫(xiě)入的設(shè)備能夠立即反饋,則將 AutoFlush 設(shè)置為 true。
Encoding // 獲取將輸出寫(xiě)入到其中的 Encoding。
MessageBox.Show(sw.Encoding.EncodingName);
NewLine // 設(shè)置由當(dāng)前 TextWriter 使用的行結(jié)束符字符串樣式
sw.NewLine = "\t"; sw.WriteLine("aaa"); sw.WriteLine("bbb"); 運(yùn)行結(jié)果:“aaa bbb ”
BaseStream //獲取同后備存儲(chǔ)區(qū)連接的基礎(chǔ)流。
三、FileStream類(lèi)的介紹
FileStream(String, FileMode) // 使用指定的路徑和創(chuàng)建模式初始化 FileStream 類(lèi)的新實(shí)例。
函數(shù)原型:public FileStream(string path, FileMode mode)
FileMode成員:
(1)Append 打開(kāi)現(xiàn)有文件并查找到文件尾,或創(chuàng)建新文件。FileMode.Append 只能同 FileAccess.Write 一起使用。
(2)Create 創(chuàng)建新文件(如果文件不存在)。如果文件已存在,它將被改寫(xiě)。這要求 FileIOPermissionAccess.Write。FileMode.Create 等效于這樣的 請(qǐng)求:如果文件不存在,則使用 CreateNew;否則使用 Truncate。
(3)CreateNew 創(chuàng)建新文件。此操作需要 FileIOPermissionAccess.Write 。如果文件已存在,則將引發(fā) IOException。
(4)Open 打開(kāi)現(xiàn)有文件。打開(kāi)文件的能力取決于 FileAccess 所指定的值。如果該文件不存在,則引發(fā) System.IO.FileNotFoundException。
(5)OpenOrCreate 打開(kāi)文件(如果文件存在);否則,創(chuàng)建新文件。如果用 FileAccess.Read 打開(kāi)文件,則需FileIOPermissionAccess.Read。
(6)Truncate 打開(kāi)現(xiàn)有文件。文件一旦打開(kāi)就將被截?cái)酁榱阕止?jié)大小。此操作需要FileIOPermissionAccess.Write。試圖從使用Truncate 打開(kāi)的文件中進(jìn)行讀取將導(dǎo)致異常。
FileStream fs = new FileStream(@"D:\a.txt", FileMode.Create);
FileStream(String, FileMode, FileAccess) // 使用指定的路徑、創(chuàng)建模式和讀/寫(xiě)權(quán)限初始化 FileStream 類(lèi)的新實(shí)例。
函數(shù)原型:public FileStream(string path, FileMode mode, FileAccess access)
FileAccess成員:
(1)Read 對(duì)文件的讀訪(fǎng)問(wèn)??蓮奈募凶x取數(shù)據(jù)。同 Write 組合即構(gòu)成讀寫(xiě)訪(fǎng)問(wèn)權(quán)。
(2)ReadWrite 對(duì)文件的讀訪(fǎng)問(wèn)和寫(xiě)訪(fǎng)問(wèn)??蓮奈募x取數(shù)據(jù)和將數(shù)據(jù)寫(xiě)入文件。
(3)Write 文件的寫(xiě)訪(fǎng)問(wèn)??蓪?shù)據(jù)寫(xiě)入文件。同 Read 組合即構(gòu)成讀/寫(xiě)訪(fǎng)問(wèn)權(quán)。
FileStream fs = new FileStream(@"D:<span style="font-size:12px;">\a.txt", FileMode.Create, FileAccess.ReadWrite);
FileStream(String, FileMode, FileAccess, FileShare) // 使用指定的路徑、創(chuàng)建模式、讀/寫(xiě)權(quán)限和共享權(quán)限創(chuàng)建 FileStream 類(lèi)的新實(shí)例。
函數(shù)原型:public FileStream(string path, FileMode mode, FileAccess access, FileShare share)
FileShare成員:
(1)Delete 允許隨后刪除文件(在一個(gè)進(jìn)程進(jìn)行讀取某文件時(shí),另一個(gè)進(jìn)程可以同時(shí)對(duì)該文件進(jìn)行刪除)。
(2)Inheritable 使文件句柄可由子進(jìn)程繼承。Win32 不直接支持此功能。
(3)None 謝絕共享當(dāng)前文件。文件關(guān)閉前,打開(kāi)該文件的任何請(qǐng)求(由此進(jìn)程或另一進(jìn)程發(fā)出的請(qǐng)求)都將失敗。
(4)Read 允許隨后打開(kāi)文件讀取。如果未指定此標(biāo)志,則文件關(guān)閉前,任何打開(kāi)該文件以進(jìn)行讀取的請(qǐng)求(由此進(jìn)程或另一進(jìn)程發(fā)出的請(qǐng)求)都將失敗。但是,即使指定了此標(biāo)志,仍可能需要附加權(quán)限才能夠訪(fǎng)問(wèn)該文件。
(5)ReadWrite 允許隨后打開(kāi)文件讀取或?qū)懭?。如果未指定此?biāo)志,則文件關(guān)閉前,任何打開(kāi)該文件以進(jìn)行讀取或?qū)懭氲恼?qǐng)求(由此進(jìn)程或另一進(jìn)程發(fā)出)都將失敗。 但是,即使指定了此標(biāo)志,仍可能需要附加權(quán)限才能夠訪(fǎng)問(wèn)該文件。
(6)Write 允許隨后打開(kāi)文件寫(xiě)入。如果未指定此標(biāo)志,則文件關(guān)閉前,任何打開(kāi)該文件以進(jìn)行寫(xiě)入的請(qǐng)求(由此進(jìn)程或另一進(jìn)過(guò)程發(fā)出的請(qǐng)求)都將失敗。但是,即使指定了此標(biāo)志,仍可能需要附加權(quán)限才能夠訪(fǎng)問(wèn)該文件。
FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);
FileStream (String, FileMode, FileAccess, FileShare, Int32) 用指定的路徑、創(chuàng)建模式、讀/寫(xiě)及共享權(quán)限和緩沖區(qū)大小初始化 FileStream 類(lèi)的新實(shí)例。
函數(shù)原型:public FileStream (string path,FileMode mode,FileAccess access,FileShare share,int bufferSize)
FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite,512);
FileStream (String, FileMode, FileAccess, FileShare, Int32, Boolean) // 使用指定的路徑、創(chuàng)建模式、讀/寫(xiě)和共享權(quán)限、緩沖區(qū)大小和同步或異步狀態(tài)初始化FileStream 類(lèi)的新實(shí)例。
函數(shù)原型:public FileStream (string path,FileMode mode,FileAccess access,FileShare share,int bufferSize,bool useAsync) // userAsyn 指定使用異步 I/O 還是同步 I/O。
備注:當(dāng)異步打開(kāi)時(shí),BeginRead 和 BeginWrite 方法在執(zhí)行大量讀或?qū)憰r(shí)效果更好,但對(duì)于少量的讀/寫(xiě),這些方法速度可能要慢得多。正確使用異步 I/O,可以使應(yīng)用程序的速度加快 10 倍,但是如果在沒(méi)有為異步 I/O 重新設(shè)計(jì)應(yīng)用程序的情況下使用異步 I/O,則可能使性能降低 10 倍。
FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite,512 ,true);
FileStream (String, FileMode, FileAccess, FileShare, Int32, FileOptions) // 使用指定的路徑、創(chuàng)建模式、讀/寫(xiě)和共享權(quán)限、其它FileStreams 可以具有的對(duì)此 文件的訪(fǎng)問(wèn)權(quán)限、緩沖區(qū)大小和附加文件選項(xiàng)初始化 FileStream 類(lèi)的新實(shí)例。
函數(shù)原型:public FileStream (string path,FileMode mode,FileAccess access,FileShare share,int bufferSize,FileOptions options)
FileOptions 成員:
(1)Asynchronous 指示文件可用于異步讀取和寫(xiě)入。
(2)DeleteOnClose 指示當(dāng)不再使用某個(gè)文件時(shí),自動(dòng)刪除該文件。
(3)Encrypted 指示文件是加密的,只能通過(guò)用于加密的同一用戶(hù)帳戶(hù)來(lái)解密。
(4)None 指示無(wú)其他參數(shù)。
(5)RandomAccess 指示隨機(jī)訪(fǎng)問(wèn)文件。系統(tǒng)可將此選項(xiàng)用作優(yōu)化文件緩存的提示。
(6)SequentialScan 指示按從頭到尾的順序訪(fǎng)問(wèn)文件。系統(tǒng)可將此選項(xiàng)用作優(yōu)化文件緩存的提示。如果應(yīng)用程序移動(dòng)用于隨機(jī)訪(fǎng)問(wèn)的文件指針,
可能不發(fā)生優(yōu)化緩存,但仍然保證操作的正確性。 指定此標(biāo)志可以提高使用順序訪(fǎng)問(wèn)讀取大文件的應(yīng)用程序的性能。對(duì)于
大多數(shù)情況下都按順序讀取大文件、但偶爾跳過(guò)小的字節(jié)范圍的應(yīng)用程序而言,性能提升可能更明顯。
(7)WriteThrough 指示系統(tǒng)應(yīng)通過(guò)任何中間緩存、直接寫(xiě)入磁盤(pán)。
FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite,512 ,FileOptions.Asynchronous);
FileStream (String, FileMode, FileSystemRights, FileShare, Int32, FileOptions) 使用指定的路徑、創(chuàng)建模式、訪(fǎng)問(wèn)權(quán)限和共享權(quán)限、緩沖區(qū)大小和附加文件選
項(xiàng)初始化 FileStream 類(lèi)的新實(shí)例。
函數(shù)原型:public FileStream (string path,FileMode mode,FileSystemRights rights,FileShare share,int bufferSize,FileOptions options)
FileSystemRights成員:(訪(fǎng)問(wèn)權(quán)限)
AppendData 指定將數(shù)據(jù)追加到文件末尾的權(quán)限。
ChangePermissions 指定更改與文件或文件夾關(guān)聯(lián)的安全和審核規(guī)則的權(quán)限。
CreateDirectories 指定創(chuàng)建文件夾的權(quán)限。此權(quán)限需要 Synchronize 值。請(qǐng)注意,如果在創(chuàng)建文件或文件夾時(shí)未顯式設(shè)置 Synchronize 值,則會(huì)自動(dòng)為您設(shè)置 Synchronize 值。
CreateFiles 指定創(chuàng)建文件的權(quán)限。此權(quán)限需要Synchronize值。請(qǐng)注意,如果在創(chuàng)建文件或文件夾時(shí)未顯式設(shè)置Synchronize 值,則會(huì)自動(dòng)為您設(shè)置Synchronize值。
Delete 指定刪除文件夾或文件的權(quán)限。
DeleteSubdirectoriesAndFiles 指定刪除文件夾和該文件夾中包含的所有文件的權(quán)限。
ExecuteFile 指定運(yùn)行應(yīng)用程序文件的權(quán)限。
FullControl 指定對(duì)文件夾或文件進(jìn)行完全控制以及修改訪(fǎng)問(wèn)控制和審核規(guī)則的權(quán)限。此值表示對(duì)文件進(jìn)行任何操作的權(quán)限,并且是此枚舉中的所有權(quán)限的組合。
ListDirectory 指定讀取目錄內(nèi)容的權(quán)限。
Modify 指定讀、寫(xiě)、列出文件夾內(nèi)容、刪除文件夾和文件以及運(yùn)行應(yīng)用程序文件的權(quán)限。此權(quán)限包括ReadAndExecute權(quán)限、Write權(quán)限和Delete權(quán)限。
Read 指定以只讀方式打開(kāi)和復(fù)制文件夾或文件的權(quán)限。此權(quán)限包括ReadData權(quán)限、
ReadExtendedAttributes 權(quán)限、ReadAttributes權(quán)限和ReadPermissions 權(quán)限。
ReadAndExecute 指定以只讀方式打開(kāi)和復(fù)制文件夾或文件以及運(yùn)行應(yīng)用程序文件的權(quán)限。此權(quán)限包括 Read 權(quán)限和 ExecuteFile 權(quán)限。
ReadAttributes 指定從文件夾或文件打開(kāi)和復(fù)制文件系統(tǒng)屬性的權(quán)限。例如,此值指定查看文件創(chuàng)建日期或修改日期的權(quán)限。這不包括讀取數(shù)據(jù)、 擴(kuò)展文件系統(tǒng)屬性或訪(fǎng)問(wèn)和審核規(guī)則的權(quán)限。
ReadData 指定打開(kāi)和復(fù)制文件或文件夾的權(quán)限。這不包括讀取文件系統(tǒng)屬性、擴(kuò)展文件系統(tǒng)屬性或訪(fǎng)問(wèn)和審核規(guī)則的權(quán)限。
ReadExtendedAttributes 指定從文件夾或文件打開(kāi)和復(fù)制擴(kuò)展文件系統(tǒng)屬性的權(quán)限。例如,此值指定查看作者和內(nèi)容信息的權(quán)限。這不包括讀取數(shù)據(jù)、文件系統(tǒng)屬性或訪(fǎng)問(wèn)和審核規(guī)則的權(quán)限。
ReadPermissions 指定從文件夾或文件打開(kāi)和復(fù)制訪(fǎng)問(wèn)和審核規(guī)則的權(quán)限。這不包括讀取數(shù)據(jù)、文件系統(tǒng)屬性或擴(kuò)展文件系統(tǒng)屬性的權(quán)限。
Synchronize 指定應(yīng)用程序是否能夠等待文件句柄,以便與 I/O 操作的完成保持同步。
Synchronize 值在允許訪(fǎng)問(wèn)時(shí)自動(dòng)被設(shè)置,而在拒絕訪(fǎng)問(wèn)時(shí)自動(dòng)被排除。創(chuàng)建文件或文件夾的權(quán)限需要此值。請(qǐng)注意,如果在創(chuàng)建文件時(shí)未顯式設(shè)置此值,
則會(huì)自動(dòng)為您設(shè)置此值。
TakeOwnership 指定更改文件夾或文件的所有者的權(quán)限。請(qǐng)注意:資源的所有者對(duì)該資源擁有完全權(quán)限。
Traverse 指定列出文件夾的內(nèi)容以及運(yùn)行該文件夾中所包含的應(yīng)用程序的權(quán)限。
Write 指定創(chuàng)建文件夾和文件以及向文件添加數(shù)據(jù)或從文件移除數(shù)據(jù)的權(quán)限。此權(quán)限包括
WriteData 權(quán)限、AppendData 權(quán)限、WriteExtendedAttributes 權(quán)限和 WriteAttributes 權(quán)限。
WriteAttributes 指定打開(kāi)文件系統(tǒng)屬性以及將文件系統(tǒng)屬性寫(xiě)入文件夾或文件的權(quán)限。這不包括寫(xiě)入數(shù)據(jù)、擴(kuò)展屬性以及寫(xiě)入訪(fǎng)問(wèn)和審核規(guī)則的功能。
WriteData 指定打開(kāi)和寫(xiě)入文件或文件夾的權(quán)限。這不包括打開(kāi)和寫(xiě)入文件系統(tǒng)屬性、擴(kuò)展文件系統(tǒng)屬性或訪(fǎng)問(wèn)和審核規(guī)則的權(quán)限。
WriteExtendedAttributes 指定打開(kāi)文件夾或文件的擴(kuò)展文件系統(tǒng)屬性以及將擴(kuò)展文件系統(tǒng)屬性寫(xiě)入文件夾或文件的權(quán)限。這不包括寫(xiě)入數(shù)據(jù)、屬性或訪(fǎng)問(wèn)和審
<span style="white-space:pre;"> </span> 核規(guī)則的功能。
方法
Read() //從流中讀取字節(jié)塊并將該數(shù)據(jù)寫(xiě)入給定緩沖區(qū)中。
函數(shù)原型:public override int Read (byte[] array,int offset,int count) // 從byte數(shù)組的offset位開(kāi)始寫(xiě)入count個(gè)字節(jié)
備注:因?yàn)镕ileStream主要用于讀取字節(jié)和字節(jié)數(shù)組,也就是二進(jìn)制數(shù)據(jù),所以它不能指定編碼格式,但是如果我們用它來(lái)讀取有中文的文本的話(huà),我們就會(huì)發(fā)現(xiàn)它會(huì)亂碼,
因?yàn)槟J(rèn)的編碼是UTF8,所以我們必須用System.Text.Encoding.GetEncoding("GB2312").GetChars()進(jìn)行轉(zhuǎn)碼,這樣很麻煩,所以我們通常不用FileStream讀寫(xiě)有中文
的文本。
byte[] byteArray = new byte[512]; char[] charArray = new char[512]; int byteCount = fs.Read(byteArray, 0, 512); System.Text.Encoding.GetEncoding("GB2312").GetChars(byteArray,0,byteCount,charArray,0); for (int i = 0; i < byteCount; i++) { <span style="white-space:pre;"> </span>MessageBox.Show(charArray[i].ToString()); }
ReadByte() // 從文件中讀取一個(gè)字節(jié),并將讀取位置提升一個(gè)字節(jié)。(沒(méi)法讀取中文)
函數(shù)原型:public override int ReadByte () //返回的字符的ASCII的十進(jìn)制數(shù),流的末尾讀取則為 -1
int b = 0; while((b = fs.ReadByte())!=-1) { <span style="white-space:pre;"> </span>MessageBox.Show(Convert.ToChar(b).ToString()); }
Seek() // 將該流的當(dāng)前位置設(shè)置為給定值。
函數(shù)原型:public override long Seek (long offset,SeekOrigin origin) //相對(duì)于origin 的點(diǎn),從此偏移offset個(gè)字節(jié)處開(kāi)始查找。(按字節(jié)偏移的,而不是字符)
SeekOrigin成員:
(1)Begin 指定流的開(kāi)頭。
(2)Current 指定流內(nèi)的當(dāng)前位置。
(3)End 指定流的結(jié)尾。
int b = 0; fs.Seek(2, SeekOrigin.Begin); //文件指針偏移到第2個(gè)字節(jié) b = fs.ReadByte(); MessageBox.Show(Convert.ToChar(b).ToString()); fs.Seek(-3, SeekOrigin.End); //文件指針從文件末尾往回偏移3個(gè)字節(jié) b = fs.ReadByte(); MessageBox.Show(Convert.ToChar(b).ToString());
假設(shè)文件的內(nèi)容是:abcdefghijk 那結(jié)果就是:c 和 j
Write() //使用從緩沖區(qū)讀取的數(shù)據(jù)將字節(jié)塊寫(xiě)入該流。
函數(shù)原型:public override void Write (byte[] array,int offset,int count) // 將字節(jié)數(shù)組從offset位開(kāi)始寫(xiě)入count個(gè)字節(jié)
byte[] byteArray = new byte[] { 97,98,99,100,110,120}; //字節(jié)數(shù)組 fs.Write(byteArray, 0, byteArray.Length); 運(yùn)行結(jié)果:abcdnx
WriteByte() //將一個(gè)字節(jié)寫(xiě)入文件流的當(dāng)前位置。
函數(shù)原型:public override void WriteByte (byte value)
byte b = 97;
fs.WriteByte(b);
BeginRead() // 開(kāi)始異步讀。 (需要設(shè)置FileOptions.Asynchronous參數(shù)才能進(jìn)行異步操作)
函數(shù)原型:public override IAsyncResult BeginRead (byte[] array,int offset,int numBytes,AsyncCallback userCallback,Object stateObject)
參數(shù):numBytes 表示最多讀取的字節(jié)數(shù)。
userCallback 異步讀操作完成后調(diào)用的方法。
stateObject 一個(gè)用戶(hù)提供的對(duì)象,它將該特定的異步讀取請(qǐng)求與其他請(qǐng)求區(qū)別開(kāi)來(lái)。
備注:調(diào)用BeginRead/BeginWrite/EndRead/EndWrite執(zhí)行異步時(shí)需要在創(chuàng)建FileStream時(shí)傳入FileOptions.Asynchronous參數(shù)才能獲取真正的IOCP支持,否則BeginXXX方法將會(huì)使用默認(rèn)定義在Stream基類(lèi)上的實(shí)現(xiàn)。Stream基類(lèi)中BeginXXX方法會(huì)使用委托的BeginInvoke方法來(lái)發(fā)起異步調(diào)用——這會(huì)使用一個(gè)額外的線(xiàn)程來(lái)執(zhí)行任務(wù)。雖然當(dāng)前調(diào)用線(xiàn)程立即返回了,但是數(shù)據(jù)的讀取或?qū)懭氩僮饕琅f占用著另一個(gè)線(xiàn)程(IOCP支持的異步操作時(shí)不需要線(xiàn)程的),因此并沒(méi)有任何“節(jié)省”,反而還很有可能降低了應(yīng)用程序的性能,因?yàn)轭~外的線(xiàn)程切換會(huì)造成性能損失。
EndRead() // 等待掛起的異步讀取完成。(需要設(shè)置FileOptions.Asynchronous參數(shù)才能進(jìn)行異步操作)
函數(shù)原型:public override int EndRead (IAsyncResult asyncResult)
參數(shù):asyncResult 對(duì)所等待的掛起異步請(qǐng)求的引用。
BeginWrite() // 開(kāi)始異步寫(xiě)。(需要設(shè)置FileOptions.Asynchronous參數(shù)才能進(jìn)行異步操作)
函數(shù)原型:public override IAsyncResult BeginWrite (byte[] array,int offset,int numBytes,AsyncCallback userCallback,Object stateObject)
EndWrite() // 結(jié)束異步寫(xiě)入,在 I/O 操作完成之前一直阻止。(需要設(shè)置FileOptions.Asynchronous參數(shù)才能進(jìn)行異步操作)
函數(shù)原型:public override void EndWrite (IAsyncResult asyncResult)
Flush() // 清除該流的所有緩沖區(qū),使得所有緩沖的數(shù)據(jù)都被寫(xiě)入到基礎(chǔ)設(shè)備。
函數(shù)原型:public override void Flush ()
屬性:
Name // 獲取操作的文件完整地址。
Length // 獲取整個(gè)文件用字節(jié)表示的流長(zhǎng)度。 (一個(gè)中文占2個(gè)字節(jié))
Position // 獲取或設(shè)置此流的當(dāng)前位置。
CanRead // 獲取當(dāng)前流是否支持讀取。(如果該流已關(guān)閉或是通過(guò)只寫(xiě)訪(fǎng)問(wèn)方式打開(kāi)的,則返回false,調(diào)用Read、ReadByte 和 BeginRead 方法將引發(fā) NotSupportedException。)
CanSeek // 獲取當(dāng)前流是否支持查找。(如果該流已關(guān)閉或是通過(guò)只寫(xiě)訪(fǎng)問(wèn)方式打開(kāi)的,則返回false,調(diào)用 Length、SetLength、Position 和 Seek 方法將引發(fā) NotSupportedException。)
CanWrite // 獲取當(dāng)前流是否支持寫(xiě)入。(如果該流已關(guān)閉或是通過(guò)只寫(xiě)訪(fǎng)問(wèn)方式打開(kāi)的,則返回false,調(diào)用 SetLength、Write、BeginWrite 或 WriteByte 方法將引發(fā) NotSupportedException。)
IsAsync // 獲取FileStream 是否異步打開(kāi)的。
Handle // 獲取當(dāng)前 FileStream 對(duì)象所封裝文件的操作系統(tǒng)文件句柄。
SafeFileHandle // 獲取 SafeFileHandle 對(duì)象,該對(duì)象表示當(dāng)前 FileStream 對(duì)象封裝的文件的操作系統(tǒng)文件句柄。
四、StreamReader/StreamWriter與FileStream的區(qū)別
FileStream對(duì)象表示在磁盤(pán)或網(wǎng)絡(luò)路徑上指向文件的流。這個(gè)類(lèi)提供了在文件中讀寫(xiě)字節(jié)的方法,但經(jīng)常使用StreamReader或 StreamWriter執(zhí)行這些功能。這是因?yàn)?span style="margin: 0px; padding: 0px; color: rgb(255, 8, 39);">FileStream類(lèi)操作的是字節(jié)和字節(jié)數(shù)組,而Stream類(lèi)操作的是字符數(shù)據(jù)。這是這兩種類(lèi)的一個(gè)重要區(qū)別,如果你是準(zhǔn)備讀取byte數(shù)據(jù)的話(huà),用StreamReader讀取然后用 System.Text.Encoding.Default.GetBytes轉(zhuǎn)化的話(huà),如下,則可能出現(xiàn)數(shù)據(jù)丟失的情況,如byte數(shù)據(jù)的個(gè)數(shù)不對(duì)等。因此操作byte數(shù)據(jù)時(shí)要用FileStream。 string textContent = fileStream.ReadToEnd();byte[] bytes = System.Text.Encoding.Default.GetBytes(textContent);
字符數(shù)據(jù)易于使用, 但是有些操作,比如隨機(jī)文件訪(fǎng)問(wèn)(訪(fǎng)問(wèn)文件中間某點(diǎn)的數(shù)據(jù)),就必須由FileStream對(duì)象執(zhí)行.
其中創(chuàng)建FileStream對(duì)象最簡(jiǎn)單的構(gòu)造函數(shù)如下:
FileStream file = new FileStream(fileName,FileMode.Member);//默認(rèn)方式,可讀可寫(xiě)
FileStream file = new FileStream(fileName, FileMode.Member, FileAccess.Member);
而FileAccess的成員:
成 員 | 說(shuō) 明 |
Read | 打開(kāi)文件,用于只讀 |
Write | 打開(kāi)文件,用于只寫(xiě) |
ReadWrite | 打開(kāi)文件,用于讀寫(xiě) |
對(duì)文件進(jìn)行不是FileAccess枚舉成員指定的操作會(huì)導(dǎo)致拋出異常。此屬性的作用是,基于用戶(hù)的身份驗(yàn)證級(jí)別改變用戶(hù)對(duì)文件的訪(fǎng)問(wèn)權(quán)限。
在FileStream構(gòu)造函數(shù)不使用FileAccess枚舉參數(shù)的版本中,使用默認(rèn)值FileAccess. ReadWrite。
FileMode枚舉成員,使用每個(gè)值會(huì)發(fā)生什么,取決于指定的文件名是否表示已有的文件。
成 員 | 文 件 存 在 | 文件不存在 |
Append | 打開(kāi)文件,流指向文件的末尾,只能與枚舉FileAccess.Write聯(lián)合使用 | 創(chuàng)建一個(gè)新文件。只能與枚舉FileAccess.Write聯(lián)合使用 |
Create | 刪除該文件,然后創(chuàng)建新文件 | 創(chuàng)建新文件 |
CreateNew | 拋出異常 | 創(chuàng)建新文件 |
Open | 打開(kāi)現(xiàn)有的文件,流指向文件的開(kāi)頭 | 拋出異常 |
OpenOrCreate | 打開(kāi)文件,流指向文件的開(kāi)頭 | 創(chuàng)建新文件 |
Truncate | 打開(kāi)現(xiàn)有文件,清除其內(nèi)容。流指向文件的開(kāi)頭,保留文件的初始創(chuàng)建日期 | 拋出異常 |
FileStream類(lèi)操作的是字節(jié)和字節(jié)數(shù)組,而Stream類(lèi)操作的是字符數(shù)據(jù)
StreamWriter允許將字符和字符串寫(xiě)入文件,它處理底層的轉(zhuǎn)換,向FileStream對(duì)象寫(xiě)入數(shù)據(jù)。StreamReader也類(lèi)似。
實(shí)例:
using System;
using System.Data;
using System.IO;
using System.Text;
/// Summary description for FileReadAndWrite
public class FileReadAndWrite
{
public FileReadAndWrite()
{
// TODO: Add constructor logic here
}
/// 用FileStream寫(xiě)文件
public void FileStreamWriteFile(string str)
{
byte[] byData;
char[] charData;
try
{
FileStream nFile = new FileStream("love.txt", FileMode.Create);
//獲得字符數(shù)組
charData = str.ToCharArray();
//初始化字節(jié)數(shù)組
byData = new byte[charData.Length];
//將字符數(shù)組轉(zhuǎn)換為正確的字節(jié)格式
Encoder enc = Encoding.UTF8.GetEncoder();
enc.GetBytes(charData, 0, charData.Length,byData,0,true);
nFile.Seek(0, SeekOrigin.Begin);
nFile.Write(byData, 0, byData.Length);
}
catch (Exception ex)
{
throw ex;
}
}
/// FileStream讀取文件
public string FileStreamReadFile(string filePath)
{
byte[] data = new byte[100];
char[] charData = new char[100];
try
{
FileStream file = new FileStream(filePath, FileMode.Open);
//文件指針指向0位置
file.Seek(0, SeekOrigin.Begin);
//讀入兩百個(gè)字節(jié)
file.Read(data, 0, 200);
//提取字節(jié)數(shù)組
Decoder dec = Encoding.UTF8.GetDecoder();
dec.GetChars(data, 0, data.Length, charData, 0);
}
catch (Exception ex)
{
throw ex;
}
return Convert.ToString(charData);
}
/// StreamWriter寫(xiě)文件
public void StreamWriterWriteFile()
{
try
{
FileStream nFile = new FileStream("love.txt", FileMode.CreateNew);
StreamWriter writer = new StreamWriter(nFile);
writer.WriteLine("I love You!");
writer.WriteLine("Do you love me!");
writer.Close();
}
catch
{ }
}
/// StreamReader讀取文件
public string StreamReaderReadFile()
{
string str="";
try
{
FileStream file = new FileStream("love.txt", FileMode.Open);
StreamReader sr = new StreamReader(file);
while (sr.ReadLine()!=null)
{
str += sr.ReadLine();
}
//或者str = sr.ReadToEnd();
sr.Close();
}
catch
{ }
return str;
}
}
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇