FileStream類


  使用FileStream能夠對對系統上的文件進行讀、寫、打開、關閉等操作。並對其他與文件相關的操作系統提供句柄操作,如管道,標准輸入和標准輸出。讀寫操作可以指定為同步或異步操作。FileStream對輸入輸出進行緩沖,從而提高性能。

  FileStream 對象支持使用 Seek 方法對文件進行隨機訪問。Seek 允許將讀取/寫入位置移動到文件中的任意位置。這是通過字節偏移參考點參數完成的。字節偏移量是相對於查找參考點而言的,該參考點可以是基礎文件的開始、當前位置或結尾,分別由 SeekOrigin 類的三個屬性表示。

  FileStream會自動緩沖數據,通過Flush()能夠強制輸出緩沖區中的數據。FileStream和其他流都會占用不在.net管理范圍的資源,因此FileStream在使用完成之后應該調用Dispose()方法或者通過using關鍵字調用。Dispose()方法會調用Close()方法,Close()方法會調用Flush()方法。這就是為什么在釋放資源前,會自動輸出緩沖區內的數據。

  FileStream中用到了好幾個枚舉,因此有必須對這些枚舉的有一定的了解,首先先來看看FileMode枚舉,FileMode枚舉是一個簡單枚舉,用於指定操作系統打開文件的方式。更詳細請查看:http://www.cnblogs.com/kissdodog/archive/2013/01/19/2868125.html

枚舉成員    成員值        描述

CreateNew    1         指定操作系統應創建新文件,如果文件存在則引發異常。
Create      2         指定操作系統創建新文件,如果文件已存在則覆蓋之。
OPen        3         指定 操作系統應打開現有文件,如果文件不存在則拋出異常。
OpenOrCreate  4         指定操作系統應打開文件,如果文件不存在則創建之。
Truncate     5         指定操作系統打開現有文件,如果文件已存在則清空,從Truncate打開的文件中讀取將引發異常。
Append      6         若文件存在,則找到文件並找到文件結尾,或者創建一個新文件。  

 

  再下來是FileAccess枚舉,FileAccess用於控制對文件的讀訪問、寫訪問或讀/寫訪問的常熟。從源代碼可以看到FileAccess是一個簡單枚舉。

枚舉成員        成員值          描述

Read           1           對文件的讀訪問,擁有讀取權限。
Write           2           對文件的寫訪問,擁有寫入權限。
ReadWrite        3           對文件的讀訪問和寫訪問,擁有讀取和寫入兩個權限。

一、構造函數

  FileStream的構造函數居然有15個之多。總之就是new就行了。

二、公共屬性

CanRead         獲取一個值,該值指示當前流是否支持讀取。
CanSeek         獲取一個值,該值指示當前流是否支持查找。
CanTimeout        獲取一個值,該值確定當前流是否可以超時。(從 Stream 繼承。)
CanWrite        獲取一個值,該值指示當前流是否支持寫入。
Handle        獲取當前 FileStream 對象所封裝文件的操作系統文件句柄。
IsAsync       獲取一個值,該值指示 FileStream 是異步還是同步打開的。
Length        獲取用字節表示的流長度。
Name          獲取傳遞給構造函數的 FileStream 的名稱。
Position           獲取或設置此流的當前位置。
ReadTimeout       獲取或設置一個值,該值指示嘗試讀取多長時間后超時。
SafeFileHandle     獲取 SafeFileHandle 對象,該對象表示當前 FileStream 對象封裝的文件的操作系統文件句柄。
WriteTimeout      獲取或設置一個值,該值確定流在超時前嘗試寫入多長時間。 (從 Stream 繼承。)

三、公共方法

BeginRead       已重寫。 開始異步讀。
BeginWrite        已重寫。 開始異步寫。
Close          關閉當前流並釋放與之關聯的所有資源(如套接字和文件句柄)。 (從 Stream 繼承。)
CreateObjRef      創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。 (從 MarshalByRefObject 繼承。)
Dispose        已重載。釋放流所占用的資源。
EndRead         已重寫。 等待掛起的異步讀取完成。
EndWrite        已重寫。 結束異步寫入,在 I/O 操作完成之前一直阻止。
Flush          已重寫。 清除該流的所有緩沖區,使得所有緩沖的數據都被寫入到基礎設備。
GetAccessControl   獲取 FileSecurity 對象,該對象封裝當前 FileStream 對象所描述的文件的訪問控制列表 (ACL) 項。
GetLifetimeService    檢索控制此實例的生存期策略的當前生存期服務對象。 (從 MarshalByRefObject 繼承。)
InitializeLifetimeService 獲取控制此實例的生存期策略的生存期服務對象。 (從 MarshalByRefObject 繼承。)
Lock           允許讀取訪問的同時防止其他進程更改 FileStream。
Read           已重寫。 從流中讀取字節塊並將該數據寫入給定緩沖區中。
ReadByte        已重寫。 從文件中讀取一個字節,並將讀取位置提升一個字節。
Seek           已重寫。 將該流的當前位置設置為給定值。
SetAccessControl    將 FileSecurity 對象所描述的訪問控制列表 (ACL) 項應用於當前 FileStream 對象所描述的文件。
SetLength       已重寫。 將該流的長度設置為給定值。
Synchronized      在指定的 Stream 對象周圍創建線程安全(同步)包裝。 (從 Stream 繼承。)
Unlock         允許其他進程訪問以前鎖定的某個文件的全部或部分。
Write          已重寫。 使用從緩沖區讀取的數據將字節塊寫入該流。
WriteByte       已重寫。 將一個字節寫入文件流的當前位置。

以下給出代碼示例(注意using或Dispose(),此處略過了):

            FileStream fs = new FileStream(@"E:\file.txt", FileMode.Create);   //打開一個寫入流
            Console.WriteLine(fs.CanRead);  //該屬性值指示文件是否可讀  True
            Console.WriteLine(fs.CanSeek);  //該屬性值指示文件是否支持查找    True
            Console.WriteLine(fs.CanTimeout);    //該屬性值指示文件是否支持超時   False
            Console.WriteLine(fs.CanWrite); //該屬性值指示文件是否可寫  True
            Console.WriteLine(fs.IsAsync);  //該屬性值指示文件是否是異步打開,異步打開則返回true,同步打開則返回false False
            Console.WriteLine(fs.Length);   //獲取用字節流表示的長度   16    與硬盤中顯示的大小一樣。
            Console.WriteLine(fs.Name);     //獲取傳遞給構造函數的文件名稱  E:\file.txt
            Console.WriteLine(fs.Position); //獲取和設置此流的當前位置,注意此方法是可賦值設置的。    0   fs.Position = 100;
            //Console.WriteLine(fs.ReadTimeout);  //獲取和設置一個值,該值指示嘗試讀取多長時間后超時,可以賦值超時,如果流上不支持超時(即fs.CanTimeout為false)則引發異常。
            //Console.WriteLine(fs.WriteTimeout); //獲取和設置一個值,嘗試寫入多長時間后算超時。如果不支持超時(即fs.CanTimeout為false)則引發異常。

            //寫入流
            string str = "你好嗎?";
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            fs.Write(bytes, 0, bytes.Length);
            fs.Flush();     //流會緩沖,此行代碼指示流不要緩沖數據,立即寫入到文件。
            fs.Close();     //關閉流並釋放所有資源,同時將緩沖區的沒有寫入的數據,寫入然后再關閉。
            fs.Dispose();   //釋放流所占用的資源,Dispose()會調用Close(),Close()會調用Flush();    也會寫入緩沖區內的數據。

            //寫入流,追加文本
            FileStream fs = new FileStream(@"E:\file.txt", FileMode.Append, FileAccess.Write);  //追加流,權限設置為可寫
            byte[] bytes = Encoding.UTF8.GetBytes("好想回家過年了!");
            fs.Write(bytes, 0, bytes.Length);
            fs.Flush();         //E:\file.txt文本變為   你好嗎?好想回家過年了!    原來文本的內容是:你好嗎?

            //寫入流,逐個字符逐個字符吸入
            FileStream fs = new FileStream(@"E:\tianyi.txt", FileMode.CreateNew, FileAccess.Write);     //在E盤下創建了E:\tianyi.txt並寫入   天意啊!
            byte[] bytes = Encoding.UTF8.GetBytes("天意啊!");
            foreach (byte b in bytes)
            {
                fs.WriteByte(b);        //逐個字節逐個字節追加入文本
            }
            fs.Flush();

            //讀取內容
            FileStream fs1 = new FileStream(@"E:\file.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
            byte[] bytes = new byte[fs1.Length];
            fs1.Read(bytes, 0, fs1.Length);
            Console.WriteLine(Encoding.UTF8.GetString(bytes));  //將讀取到的值獲取成字符串輸出

            //逐個字符讀取
            FileStream fs = new FileStream(@"E:\file.txt", FileMode.Open, FileAccess.ReadWrite);
            byte[] bytes = new byte[fs.Length];
            for (int i = 0; i < fs.Length; i++)
            {
                bytes[i] = (byte)fs.ReadByte();     //逐個字節逐個字節的讀取,當讀取完之后會自動將當前讀取位置移動到下一位
            }
            Console.WriteLine(Encoding.UTF8.GetString(bytes));      //輸出E:\file.txt的文本內容  "你好嗎"


            //未明白的東西
            //fs.Handle
            //fs.SafeFileHandle
            //CreateObjRef 
            //GetAccessControl
            //GetLifetimeService
            //InitializeLifetimeService
            //SetAccessControl
            //Synchronized 

 


免責聲明!

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



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