MemoryMapped文件访问异常

问题描述 投票:0回答:1

我正在尝试使用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

感谢任何输入。谢谢!

c# io memory-mapped-files
1个回答
0
投票

您的计算是错误的。在计算每种颜色的大小时,您没有考虑到不需要的偏移量。当您调用CreateViewFromStream并告诉它跳过offset时,它试图读取太多字节,从而导致AccessException

例如:

  • 文件大小= 60字节
  • 偏移= 2个字节
  • 颜色数= 6

您的原始计算将导致:

  • byteSizeForEachColor = 10

所以您的循环将跳过前2个字节,然后为每种颜色读取10个字节,但是当涉及到最后一种颜色时,它已经超出了文件末尾的位置

  • 5 x(10 + 2)= 60
  • 6 x(10 + 2)= 72 //文件只有60字节长-太远了

您需要从计算出的大小中减去offsetToBegin,以确保它只读取正确的字节数。

使用上述值

  • bytesizeForEachColor =(60/6)-2 = 8

因此,每种颜色只能读取8个字节。您需要将代码更改为:

using (var view = mmf.CreateViewStream(idx, byteSizeForEachColor - idx, MemoryMappedFileAccess.Read))
{
    ...
}

现在,每个循环将跳过2个字节并读取8个字节-这不会导致它超出文件的长度。

© www.soinside.com 2019 - 2024. All rights reserved.