原文鏈接:http://developer.51cto.com/art/200908/145675.htm
在通常的C#開發中,你是怎麼通過C#讀取文件信息的?C#給我們提供了非常強大的類庫(又一次吹捧了.NET一番),裡面封裝了幾乎所有我們可以想到的和我們沒有想到的類,流是讀取文件的一般手段,使用流讀取。是的沒錯,那麼你真的會用它讀取文件中的數據了麼?真的能讀完全麼?
通常我們使用C#讀取文件信息使用如下的步驟:
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句就可以用C#讀取文件信息,而且裡面的內容原封不動的讀出來,真是太簡潔了!可以這段代碼真的能像你預期的那樣工作麼?答案是:幾乎可以!
在大部分情況下上面的代碼工作的很好,但是我們應該注意Read方法是有返回值的,既然有返回值那麼一定有其道理,如果按照上面的寫法完全可以是一個沒有返回值的函數。我想返回值的目的是,為了給我們一個機會判斷實際讀取文件的大小,從而來判斷文件是否已經完全讀完。所以上面的代碼不能保證我們一定讀完了文件裡面的所有字節(雖然在很多情況下是讀完了)。下面的方法提供了一個比上面方法更安全的方法,來保證文件被完全讀出。
SafeRead(Stream stream, offset = remaining = (remaining > read = (read <= EndOfStreamException( + read.ToString() + remaining -= offset +=
有些情況下你不知道流實際的長度比如:網絡流。此時可以使用類似的方法讀取流直到流裡面的數據完全讀取出來為止。我們可以先初始化一段緩存,再將流讀出來的流信息寫到內存流裡面,就像下面這樣:
[] buffer = [ (MemoryStream ms = ( read = stream.Read(buffer, (read <=
雖然上面實現C#讀取文件信息的例子都比較簡單,效果也不是很明顯(大部分都是對的),也許你早就會了,沒關系這篇文章本來就是寫給初學者的。
再來看一段代碼示例:
[] Read2Buffer(Stream stream, (BufferLen < = [] buffer = read = ((block =- read)) > read += (read == nextByte = (nextByte == - [] newBuf = [buffer.Length * = (= newBuf; read++ [] ret =
上面的方法提供了一種使用指定緩存長度的方式讀取流,雖然在很多情況下你可以直接使用Stream.Length得到流的長度,但是不是所有的流都可以得到。通過這樣的方法,我們可以輕松實現C#讀取文件信息的簡潔和完整性。