五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > C#中StreamWriter、StreamReader和FileStream的用法和區(qū)別

C#中StreamWriter、StreamReader和FileStream的用法和區(qū)別

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):1506    更新時(shí)間:2018-06-04 20:25   參與評(píng)論

本文主要講解一下在文件的讀取中,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)入論壇

發(fā)表評(píng)論 (1506人查看,0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱(chēng):
最新評(píng)論
------分隔線(xiàn)----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢(xún)

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)