2013-04-08 64 views
0

我有一個非常大的BMP文件,我必須一次全部讀取,因爲我需要在將它寫入臨時文件時反轉字節。這個BMP是1.28GB,我得到了「內存不足」的錯誤。我無法完全讀取它(使用ReadAllBytes)或將緩衝區放入二進制數組中,因爲我無法初始化該大小的數組。我也無法使用緩衝區將它讀入List(我可以使用Reverse()),因爲它的中途耗盡內存。難以將大文件讀入字節數組

所以基本上問題是,我如何讀取一個非常大的文件向後(即,從LastByte開始到FirstByte結束),然後將其寫入磁盤?

獎勵:將反轉文件寫入磁盤時,不要寫入最後54個字節。

+1

編輯問題,包括你使用,因爲會有所幫助,從4版開始的.NET framework版本,可以通過託管代碼訪問內存映射文件。 – 2013-04-08 08:51:12

回答

4

對於StreamReader對象,您可以Seek(將「遊標」放置到任何特定的字節),以便您可以使用它反轉整個文件的內容。

例子:

const int bufferSize = 1024; 
string fileName = 'yourfile.txt'; 

StreamReader myStream = new StreamReader(fileName); 
myStream.BaseStream.Seek(bufferSize, SeekOrigin.End); 

char[] bytes = new char[bufferSize]; 
while(myStream.BaseStream.Position > 0) 
{ 
    bytes.Initialize(); 
    myStream.BaseStream.Seek(bufferSize, SeekOrigin.Current); 
    int bytesRead = myStream.Read(bytes, 0, bufferSize); 
} 
+0

感謝!而不是SeekOrigin.Current,我只是通過使用Position選項來遍歷文件,讀取我需要的字節數,然後在將緩衝區寫入具有Filestream Append的磁盤之前倒轉緩衝區。很棒! – Aeon2058 2013-04-09 06:38:44

4

由於CLR應用程序和集合內部對32位或64位平臺的隱含內存限制,您通常無法在.NET中處理如此大的文件。

爲此,您可以使用Memory Mapped File直接從磁盤讀取文件,而不將其加載到內存中。一次創建的存儲器映射會將讀指針移動到文件結尾並向後讀取。

希望這會有所幫助。