Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 内存映射文件访问异常_C#_Io_Memory Mapped Files - Fatal编程技术网

C# 内存映射文件访问异常

C# 内存映射文件访问异常,c#,io,memory-mapped-files,C#,Io,Memory Mapped Files,我正在尝试使用MemoryMap读取一个大文件(二进制\文本混合) 然而,在我的循环迭代中,它只是给出了一个访问异常;只是它,它没有说明它是什么样的异常,为什么它不能阅读,等等。我已经试着弄清楚了几个小时,但没有得出任何结论 下面是我用来阅读的代码: //numOfColors = 6 private static void ReadChunksFromLargeFile(int offsetToBegin, string fName, int numOfC

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

    }
//numofolors=6
私有静态void ReadChunksFromLargeFile(int offsetToBegin,string fName,int numOfColors)
{
var idx=offsetToBegin;
int byteSizeForEachColor=(int)新文件信息(fName).Length/numofolors;
var buffer=新字节[byteSizeForEachColor];
使用(var mmf=MemoryMappedFile.CreateFromFile(fName))
{
对于(int i=0;i
编辑:offsetToBegin是937

我想做的是根据我需要的大小来阅读大量的内容。然而,当i=5时,它只是抛出异常

我试图读取的文件如下:


欢迎您的任何意见。谢谢

你的计算错了。计算每种颜色的大小时,没有考虑不需要的偏移量。调用
CreateViewFromStream
并告诉它跳过
偏移量
时,它试图读取太多字节,导致
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个-这不会导致它超出文件的长度。

文件有多大?什么是
numofolors
?我猜文件大小减去偏移量,应该在颜色数之间平均分配?在除以
numofolors
之前,您是否尝试过从
FileInfo.Length
值中减去
offsetToBegin
?@SimplyGed我也尝试过从0(begin)开始,遇到了同样的问题。该文件为39585152字节。即使从0开始,我也有同样的异常。对不起,我忘了说NumofColor是6。我将把这些信息添加到问题中。我已经有一段时间没有使用MM IO了,但是为什么不创建整个文件的视图并在其中查找,而不是分配多个视图呢?