我正在尝试使用MemoryMap读取大文件(二进制\文本混合)。
但是,在我的循环迭代中,它只是给出了访问异常;只是它,它没有说明它是什么异常,为什么它无法读取等。我一直在试图弄清楚它几个小时,但无法得出任何结论。
这是我用来阅读的代码:
//numOfColors = 6
private static void ReadChunksFromLargeFile(int offsetToBegin, string fName, int numOfColors)
{
var idx = offsetToBegin;
int byteSizeForEachColor = (int)new FileInfo(fName).Length/ numOfColors;
var buffer = new byte[byteSizeForEachColor];
using (var mmf = MemoryMappedFile.CreateFromFile(fName))
{
for(int i=0; i < numOfColors; i++)
{
//numOfColors = 6
using (var view = mmf.CreateViewStream(idx, byteSizeForEachColor, MemoryMappedFileAccess.Read))
{
view.Seek(idx, SeekOrigin.Begin);
view.Read(buffer, 0, byteSizeForEachColor);
var temp = ByteArrayToHexString(buffer);
File.WriteAllText($@"C:\test\buffertest{i}.hex", temp);
}
idx += byteSizeForEachColor;
}
}
}
编辑:offsetToBegin为937
我想做的就是根据我需要的大小读取大块。但是,当涉及到i = 5时,它只会引发异常。
我正在尝试读取的文件是此文件:https://drive.google.com/file/d/1DsLaNnAOQDyWJ_g4PPNXGCNfbuirs_Ss/view?usp=sharing
感谢任何输入。谢谢!
您的计算是错误的。在计算每种颜色的大小时,您没有考虑到不需要的偏移量。当您调用CreateViewFromStream
并告诉它跳过offset
时,它试图读取太多字节,从而导致AccessException
。
例如:
您的原始计算将导致:
所以您的循环将跳过前2个字节,然后为每种颜色读取10个字节,但是当涉及到最后一种颜色时,它已经超出了文件末尾的位置
您需要从计算出的大小中减去offsetToBegin
,以确保它只读取正确的字节数。
使用上述值
因此,每种颜色只能读取8个字节。您需要将代码更改为:
using (var view = mmf.CreateViewStream(idx, byteSizeForEachColor - idx, MemoryMappedFileAccess.Read))
{
...
}
现在,每个循环将跳过2个字节并读取8个字节-这不会导致它超出文件的长度。