2013-04-08 65 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直接从磁盘读取文件,而不将其加载到内存中。一次创建的存储器映射会将读指针移动到文件结尾并向后读取。

希望这会有所帮助。