c 檔案操作

2021-05-03 21:52:27 字數 4497 閱讀 9149

檔案操作

目錄操作

system.io 類

目錄操作

string drives = directory.getlogicaldrives(); //本地驅動器的名,如:c:/等

string path = directory.getcurrentdirectory(); //獲取應用程式的當前工作目錄

path.getfilename(@"c:/dir/file.txt");           //獲取子目錄的名字,result的結果是file.txt

directory.getfiles(路徑及檔名)                //獲取指定目錄中的檔名(檔案列表)

directoryinfo di = new directoryinfo(@"f:/mydir"); //建構函式建立目錄

directoryinfo di=directory.createdirectory(@"f:/bbs"); //建立物件並建立目錄

if (di.exists == false) //檢查是否存在此目錄

di.create(); //建立目錄

directoryinfo dis = di.createsubdirectory("subdir"); //以相對路徑建立子目錄

dis.delete(true); //刪除剛建立的子目錄

di.delete(true); //刪除建立目錄

檔案操作

directory.delete(@"f:/bbs2", true); //刪除目錄及其子目錄和內容(如為假不能刪除有內容的目錄包括子目錄)

directory.getdirectories 方法 //獲取指定目錄中子目錄的名稱

string dirs = directory.getdirectories(@"f:/", "b*");

console.writeline("此目錄中以b開頭的子目錄共個!", dirs.length);

foreach (string dir in dirs)

directory.getfilesystementries //獲取指定目錄中的目錄及檔名

directory.getlogicaldrives //檢索此計算機上格式為「《驅動器號》:/」的邏輯驅動器的名稱,【語法同上】

directory.getparent //用於檢索父目錄的路徑。

directoryinfo a = directory.getparent(path);

console.writeline(a.fullname);directory.move //移動目錄及其在內的所有檔案

directory.move(@"f:/bbs/1", @"f:/bbs/2"); //將資料夾1內的檔案剪到資料夾2內 資料夾2是剛建立的

stream // 對位元組的讀寫操作(包含對非同步操作的支援) reading writing seeking

binaryreader和binarywriter // 從字串或原始資料到各種流之間的讀寫操作

filestream類通過seek()方法進行對檔案的隨機訪問,預設為同步

textreader和textwriter //用於gb2312字元的輸入和輸出

stringreader和stringwriter //在字串中讀寫字元

streamreader和streamwriter //在流中讀寫字元

bufferedstream 為諸如網路流的其它流新增緩衝的一種流型別.

memorystream 無緩衝的流

networkstream 網際網路絡上的流

通常我們讀取乙個檔案使用如下的步驟:

1、宣告並使用file的openread例項化乙個檔案流物件,就像下面這樣

filestream fs = file.openread(filename);

或者filestream fs = filestream(filename, filemode.open, fileaccess.read, fileshare.read);

2、準備乙個存放檔案內容的位元組陣列,fs.length將得到檔案的實際大小,就像下面這樣

byte data = new byte[fs.length];

3、哇!開始讀了,呼叫乙個檔案流的乙個方法讀取資料到data陣列中

fs.read (data, 0, data.length);

呵呵!我們只寫了3句就可以把檔案裡面的內容原封不動的讀出來,真是太簡潔了!可以這段**真的能像你預期的那樣工作麼?答案是:幾乎可以!在大部分情況下上面的**工作的很好,但是我們應該注意read方法是有返回值的,既然有返回值那麼一定有其道理,如果按照上面的寫法完全可以是乙個沒有返回值的函式。我想返回值的目的是,為了給我們乙個機會判斷實際讀取檔案的大小,從而來判斷檔案是否已經完全讀完。所以上面的**不能保證我們一定讀完了檔案裡面的所有位元組(雖然在很多情況下是讀完了)。下面的方法提供了乙個比上面方法更安全的方法,來保證檔案被完全讀出

public static void saferead (stream stream, byte data){

int offset=0;

int remaining = data.length;

// 只要有剩餘的位元組就不停的讀

while (remaining > 0){

int read = stream.read(data, offset, remaining);

if (read <= 0)

throw new endofstreamexception("檔案讀取到"+read.tostring()+"失敗!");

// 減少剩餘的位元組數

remaining -= read;

// 增加偏移量

offset += read;

有些情況下你不知道流實際的長度比如:網路流。此時可以使用類似的方法讀取流直到流裡面的資料完全讀取出來為止。我們可以先初始化一段快取,再將流讀出來的流資訊寫到記憶體流裡面,就像下面這樣:

public static byte readfully (stream stream){

// 初始化乙個32k的快取

byte buffer = new byte[32768];

using (memorystream ms = new memorystream()){ //返回結果後會自動**呼叫該物件的dispose方法釋放記憶體

// 不停的讀取

while (true){

int read = stream.read (buffer, 0, buffer.length);

// 直到讀取完最後的3m資料就可以返回結果了

if (read <= 0)

return ms.toarray();

ms.write (buffer, 0, read);

雖然上面的例子都比較簡單,效果也不是很明顯(大部分都是對的),也許你早就會了,沒關係這篇文章本來就是寫給初學者的。

下面的方法提供了一種使用指定快取長度的方式讀取流,雖然在很多情況下你可以直接使用stream.length得到流的長度,但是不是所有的流都可以得到。

public static byte read2buffer (stream stream, int bufferlen){

// 如果指定的無效長度的緩衝區,則指定乙個預設的長度作為快取大小

if (bufferlen < 1){

bufferlen = 0x8000;

// 初始化乙個快取區

byte buffer = new byte[bufferlen];

int read=0;  

int block;

// 每次從流中讀取快取大小的資料,知道讀取完所有的流為止

while ( (block = stream.read(buffer, read, buffer.length-read)) > 0){

// 重新設定讀取位置

read += block;

// 檢查是否到達了快取的邊界,檢查是否還有可以讀取的資訊

if (read == buffer.length){

// 嘗試讀取乙個位元組

int nextbyte = stream.readbyte();

// 讀取失敗則說明讀取完成可以返回結果

if (nextbyte==-1){

return buffer;

// 調整陣列大小準備繼續讀取

byte newbuf = new byte[buffer.length*2];

array.copy(buffer, newbuf, buffer.length);

newbuf[read]=(byte)nextbyte;

buffer = newbuf;// buffer是乙個引用(指標),這裡意在重新設定buffer指標指向乙個更大的記憶體

read++;

// 如果快取太大則使用ret來收縮前面while讀取的buffer,然後直接返回

byte ret = new byte[read];

array.copy(buffer, ret, read);

return ret;

C 檔案操作與C 的檔案操作

c filestream 檔案流 主要用於使用二進位制方式讀寫檔案資料,可讀取任何檔案 建立filestream物件 e 建立filestream物件 filemode 指定系統開啟檔案的方式filestream fileaccess 指定檔案的訪問方式 read唯讀,write只寫,readwri...

C 檔案操作

c 追加檔案 sw.writeline 追逐理想 sw.writeline kzlll sw.writeline net筆記 sw.flush sw.close c 拷貝檔案 string orignfile,newfile file.copy orignfile,newfile,true c 刪除...

C 檔案操作

c 檔案操作 軒軒 發表於 2006 2 18 12 40 16 在c 中,有乙個stream這個類,所有的i o都以這個 流 類為基礎的,包括我們要認識的檔案i o,stream這個類有兩個重要的運算子 1 插入器 向流輸出資料。比如說系統有乙個預設的標準輸出流 cout 一般情況下就是指的顯示器...