我有一个非常大的BMP文件,我必须立即读取,因为我需要在将其写入临时文件时反转字节。这个BMP是1.28GB,我得到了“Out of memory”错误。我无法完全读取它(使用ReadAllBytes)或将缓冲区用于二进制数组,因为我无法初始化该大小的数组。我也无法使用缓冲区将其读入List(我可以使用Reverse()),因为它已经耗尽内存。
基本上问题是,如何读取一个非常大的文件向后(即从LastByte开始到FirstByte结束),然后将其写入磁盘?
奖励:将反向文件写入磁盘时,不写入最后54个字节。
答案 0 :(得分:4)
由于CLR应用程序及其内部集合的隐含内存限制,无论是32还是64平台,都无法正常处理.NET中的大文件。
为此,您可以使用Memory Mapped File直接从磁盘读取文件,而无需将其加载到内存中。创建一次内存映射会将读取指针移动到文件末尾并向后读取。
希望这有帮助。
答案 1 :(得分: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);
}
答案 2 :(得分:2)
您可以使用内存映射文件。
http://msdn.microsoft.com/en-us/library/vstudio/dd997372%28v=vs.100%29.aspx
此外,您可以使用FileStream并通过stream.Seek(xxx,SeekOrigin.Begin)(相对位置)或位置属性(绝对位置)定位必要的位置。