0

我有一个非常大的 BMP 文件,我必须一次全部读取,因为在将其写入临时文件时需要反转字节。此 BMP 为 1.28GB,我收到“内存不足”错误。我无法完全读取它(使用 ReadAllBytes)或使用缓冲区到二进制数组,因为我无法初始化该大小的数组。我也无法使用缓冲区将其读入列表(然后我可以使用 Reverse()),因为中途内存不足。

所以基本上问题是,我如何向后读取一个非常大的文件(即,从 LastByte 开始并在 FirstByte 结束)然后将其写入磁盘?

奖励:将反转文件写入磁盘时,不要写入最后 54 个字节。

4

3 回答 3

4

您通常无法在 .NET 中处理如此大的文件,因为 CLR 应用程序和其中的集合的隐含内存限制既不适用于 32 也不适用于 64 平台。

为此,您可以使用Memory Mapped File直接从磁盘读取文件,而无需将其加载到内存中。一次创建的内存映射将读取指针移动到文件末尾并向后读取。

希望这可以帮助。

于 2013-04-08T08:45:34.347 回答
4

使用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);
}
于 2013-04-08T08:45:59.730 回答
2

您可以使用内存映射文件。

http://msdn.microsoft.com/en-us/library/vstudio/dd997372%28v=vs.100%29.aspx

此外,您可以使用 FileStream 并通过 stream.Seek(xxx, SeekOrigin.Begin) (相对位置)或 Position 属性(绝对位置)在必要位置上定位。

于 2013-04-08T08:45:40.680 回答