2014-08-29 79 views
1

我有一個大小爲4.5GB的文本文件,它是由一個實驗應用程序創建的。在我的8GB RAM系統上,該文件無法打開(使用崇高文本進行嘗試)。我只想從結尾中讀取這個文件的內容,比如說從最後45個字符開始,而不是將整個文件加載到內存中。這個怎麼做 ? 內置的方法等,如何在C#中讀取非常龐大的文件?

StreamReader.ReadBlock(char[] buffer,int index,int count) 

具有類型INT爲指數,但對於我的情況下,索引超出爲int值的範圍內的。如果只有長時間的超載。如何克服這一點?謝謝。

+4

去oldschool? FOPEN/FSEEK? – 2014-08-29 19:36:50

+5

['FileStream.Seek(long offset,SeekOrigin origin)'](http://msdn.microsoft.com/en-us/library/system.io.filestream.seek(v = vs.110).aspx)? Darin Dimitrov顯示了一個示例如何執行此操作:http://stackoverflow.com/questions/4368857/read-from-a-file-starting-at-the-end-similar-to-tail – birryree 2014-08-29 19:37:23

+0

什麼編碼是文本文件在?如果是UTF-8,你能保證文件中只有單字節寬字符嗎? – 2014-08-29 19:40:39

回答

3

A Stream具有long特性PositionLength。您可以將Position設置爲[0, Length[範圍內的任意值,如fileStream.Position = fileStream.Length - 45;

或者,您可以使用Stream.Seek函數:fileStream.Seek(-45, SeekOrigin.End)

根據周圍的代碼和情況,使用可讀性更強的文檔,這是最能表達您意圖的文字。

下面是一些代碼:

using (var fileStream = File.OpenRead("myfile.txt")) 
using (var streamReader = new StreamReader(fileStream, Encoding.ASCII)) 
{ 
    if (fileStream.Length >= 45) 
     fileStream.Seek(-45, SeekOrigin.End); 

    var value = streamReader.ReadToEnd(); // Last 45 chars; 
} 

這是容易,因爲你知道你的文件在ASCII編碼。否則,您必須從讀取文件的開頭讀取一些文本,讓其檢測編碼(如果存在BOM),然後才能找到您想要讀取的位置。

+1

問題是'StreamReader'不是從'Stream'派生的。你應該展示兩者如何相互作用。 – 2014-08-29 19:45:52

+0

@Scott,我假定OP已經有一個文件流,但你說得對,這裏有一些示例代碼是合適的。 – 2014-08-29 19:52:46

相關問題