我有一个非常大的BMP文件,我必须一次全部读取,因为我需要在将其写入临时文件时反转字节。这个BMP是1.28GB,我得到了"内存不足"的错误。我不能完全读取它(使用ReadAllBytes)或使用缓冲区到二进制数组中,因为我不能初始化该大小的数组。我也不能使用缓冲区将它读入List(然后我可以使用Reverse()),因为它在中途耗尽了内存。
所以基本上问题是,我如何读取一个非常大的文件向后(即,从LastByte开始,在FirstByte结束),然后写到磁盘?附加功能:当将反向文件写入磁盘时,不写入最后54字节。
对于StreamReader
对象,您可以查找(放置"游标")到任何特定的字节,因此您可以使用它来反向遍历整个文件的内容。
的例子:
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);
}
在。net中通常不能处理这么大的文件,因为CLR应用程序和其中的集合在32和64平台上都有隐含的内存限制。
对此,您可以使用内存映射文件,直接从磁盘读取文件,而不将其加载到内存中。创建的一次性内存映射将读取指针移动到文件的末尾并向后读取。
可以使用内存映射文件
http://msdn.microsoft.com/en-us/library/vstudio/dd997372%28v=vs.100%29.aspx另外,您可以使用FileStream并按流在必要的位置上定位。查找(xxx, SeekOrigin.Begin)(相对位置)或position属性(绝对位置)