C 之IO類庫 二 讀寫檔案

2022-02-07 19:59:00 字數 3603 閱讀 6847

我們能夠利用c#的io庫進行檔案,文字的讀寫操作,一般的操作是先開啟檔案,進行讀寫操作,再關閉檔案。其中開啟檔案的操作可以通過fileinfo物件進行,也可以通過file類進行,但是更常用和方便的是用file類進行,所以本文將只介紹用file類開啟檔案的方法。

一.檔案的簡單讀寫操作

如果你只想開啟檔案簡單的讀寫,file類提供了一些函式能夠一條語句就完成開啟檔案,讀或寫,關閉檔案等操作:

1.讀取檔案內容

下面的方法都將先開啟檔案,讀取並關閉檔案,檔案不存在將會報錯

readallbytes:以位元組陣列byte的形式獲取檔案內容

readalllines:以字串陣列string的形式獲取檔案內容,可以指定編碼形式,如果不指定編碼,將嘗試自動檢測檔案的編碼

readalltext: 以字串string的形式獲取檔案內容,可以指定編碼形式,如果不指定編碼,將嘗試自動檢測檔案的編碼

readlines:返回ienumerable形式的字串陣列,這樣可以用如下的方式一行行的訪問檔案內容,可以指定編碼形式,如果不指定編碼,將使用utf-8編碼

foreach (string line in file.readlines(@"c:\jingle\test.txt"))

2.寫入檔案內容

下面的方法都將先新建檔案並開啟,寫入並關閉檔案,如果檔案存在將覆蓋原檔案

writeallbytes:以位元組陣列byte的形式寫入檔案內容

writealllines:以字串陣列string或ienumerable的形式寫入檔案內容,可以指定編碼形式,如果不指定編碼,將使用utf-8編碼

writealltext:以字串string的形式獲取檔案內容,可以指定編碼形式,如果不指定編碼,將使用utf-8編碼

二.用filestream操作文字內容public static filestream create(

string path,

int buffersize,

fileoptions options,

filesecurity filesecurity

)options的值可以為以下選項的或值

a.none

b.writethrough 表明寫的內容不用快取,直接存入檔案

c.asynchronous 表明檔案可非同步讀寫

d.randomaccess 表明檔案可以隨機訪問

e.deleteonclose 表明檔案不使用後會自動刪除

f.sequentialscan 表明檔案只能順序訪問,在讀很大的檔案時能提高效率

g.encrypted 表明檔案被加密

openread:

等價於open(path, filemode.open,fileaccess.read,fileshare.read)

openwrite:

等價於open(path, filemode.openorcreate,fileaccess.write,fileshare.none)

另外還可以直接新建filestream。

2.讀寫操作

可使用copyto,read,write,writebyte等函式寫入位元組陣列.

寫入後用flush函式清除該流的所有緩衝區,並使得所有緩衝資料被寫入到基礎裝置。

如果想要撤銷某些寫入的資料,可以使用setlength函式

3.定位

用seek(

long offset,

seekorigin origin

)函式來進行定位。

用origin來表明查詢的起始位置是在檔案頭,檔案尾,還是當前位置。

offset是相對於origin位置的便宜。

用position直接定位

4.判斷是否讀到檔案尾

通過比較length和position屬性來判斷是否是檔案尾

5.非同步讀寫

當操作的文字太大,需要進行非同步讀寫以提高效能

要進行非同步讀寫,首先文字需要用非同步的方式開啟

a.可使用 filestream(string, filemode, fileaccess, fileshare, int32, boolean) 函式,以非同步方式開啟

b.可通過設定fileoptions引數,以非同步方式開啟

有的平台不支援非同步開啟,所以我們可以用isasync屬性判斷是否成功非同步開啟了。

從.net framework 4.5開始支援用copytoasync,readasync,writeasync,flushasync來進行非同步讀寫。

.net framework 4.5之前用beginread,beginwrite,endread,endwrite函式來進行非同步讀寫。

三.用streamreader讀檔案

streamreader繼承自textreader

1.建立streamreader

a.使用file.opentext函式以utf-8編碼開啟並返回streamreader物件

b.用stream建立streamreader物件,這種建立方法讓我們能方便的讀取其他的stream物件。

c.用檔案路徑建立streamreader物件

2.讀操作

read():讀乙個字元。

read(char, int32, int32):從當前流中將指定的最多個字元讀到指定索引位置開始的緩衝區。

readblock:read的block版本

readline:讀取一行字元

readtoend:讀所有字元

3.預讀

在文字處理中經常希望預先知道下面要讀的內容,streamreader提供了兩個很有用的函式

endofstream判斷是否是檔案尾

peek返回下乙個字元,但是不改變當前位置,如果沒有要讀取的字元或該流不支援查詢,則為-1

4.定位

用basestream返回基本流來進行定位

但是如果已經進行了讀取操作,內部緩衝區和basestream的位置不一致,這時需要用discardbuffereddata函式來令兩者一致後再進行定位。

reader.discardbuffereddata();

reader.basestream.location = 8;

5.非同步讀

從.net framework 4.5開始支援用readasync,readblockasync,readlineasync,readtoendasync來進行非同步讀。

四.用streamwriter寫檔案2.寫操作

a.支援用write和writeline函式直接寫入boolean,decimal,double,int32,int64,uint32,uint64,single,char,object,char,string等資料

b.支援用write和writeline函式格式化寫內容,格式化參見

c.寫入後用flush函式清除該流的所有緩衝區,並使得所有緩衝資料被寫入到基礎裝置。如果將autoflush屬性設為true,則能自動flush

3.定義行結束符

我們可以用newline屬性來定義自己想要的行結束符

4.非同步寫

從.net framework 4.5開始支援用writeasync,writelineasync來進行非同步寫。

系統IO之檔案讀寫

ssize t write int fd,const void buf,size t count 功能 寫入資料 fd 檔案描述符,open函式的返回值 buf 待寫入的記憶體首位址 count 要寫入的位元組數 返回值 成功 寫入的位元組數 失敗 返回 1 ssize t read int fd,...

C語言 讀寫檔案I O

c語言讀寫檔案的步驟一般是 建立或開啟檔案 讀或寫檔案 關閉檔案 當然讀或寫的過程中還可以通過操作當前檔案偏移量來控制讀寫位置。下面分別介紹這些函式。標頭檔案 include 此標頭檔案定義了以下oflag o rdonly 唯讀0 o wronly 只寫1 o rdwr 讀寫2 上面三個oflag...

C 標準庫之IO庫(二)

fstream檔案中定義了三種支援檔案io的型別,ifstream提供讀檔案的功能,ofstream提供寫檔案的功能,fstream提供讀寫檔案的功能。因為它們分別是從istream,ostream,iostream繼承來的,所以可以使用操作符 和 進行格式化的輸入輸出,條件流狀態也可以使用。除了繼...