Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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#_File_Io_Filestream - Fatal编程技术网

C# 读取大文件

C# 读取大文件,c#,file,io,filestream,C#,File,Io,Filestream,我尝试用两种方式读取2+gb文件,第一种: var file = File.ReadAllBytes(filepath); 返回超过2gb的异常文件 第二种方式: var file = ReadAllBytes(filepath); public byte[] ReadAllBytes(string fileName) { byte[] buffer = null; using (FileStream fs = new FileStream(fileName, FileMo

我尝试用两种方式读取2+gb文件,第一种:

var file = File.ReadAllBytes(filepath);
返回超过2gb的异常文件

第二种方式:

var file = ReadAllBytes(filepath);

public byte[] ReadAllBytes(string fileName)
{
    byte[] buffer = null;

    using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        buffer = new byte[fs.Length];
        fs.Read(buffer, 0, (int)fs.Length);
    }

    return buffer;
}
异常:“数组维度超出了支持的范围。” 我的目标是在http请求主体中发送文件(使用WebClient类)

有没有关于如何读取大文件的示例

谢谢你可以试试这个:

public void ProcessLargeFile(string fileName)
{
    int bufferSize = 100 * 1024 * 1024; // 100MB
    byte[] buffer = new byte[bufferSize];
    int bytesRead = 0;

    using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        while ((bytesRead = fs.Read(buffer, 0, bufferSize)) > 0)
        {
            if (bytesRead < bufferSize)
            {
                // please note array contains only 'bytesRead' bytes from 'bufferSize'
            }

            // here 'buffer' you get current portion on file 
            // process this
        }
    }
}
public void ProcessLargeFile(字符串文件名)
{
int bufferSize=100*1024*1024;//100MB
字节[]缓冲区=新字节[bufferSize];
int字节读取=0;
使用(FileStream fs=newfilestream(文件名,FileMode.Open,FileAccess.Read))
{
而((bytesRead=fs.Read(buffer,0,bufferSize))>0)
{
if(字节读取<缓冲区大小)
{
//请注意,数组仅包含“bufferSize”中的“bytesRead”字节
}
//这里是“缓冲区”,您可以得到文件中的当前部分
//处理这个
}
}
}

这将允许您按100MB部分处理文件,您可以将此值更改为所需值。

您遇到了一个相当旧的限制,即用户模式虚拟地址空间的2 GiB限制。您可以使用正确的编译器/清单开关和/或在x64模式下运行相同的程序来提升它。您可以在此处详细阅读:

在某些大小下,文件或查询结果集无法完全加载到内存中(由于限制),或者在开始处理之前最好不要完全加载(由于性能)。对于这些情况,枚举数是有用的。与…比较由于使用了枚举器,ReadLines只需要在内存中至少保留一行,即当前的一行。可以删除它已处理的所有行。那些仍在未来的可能已经加载,也可能尚未加载。它在任何时候都不需要将完整的文件加载到内存中


不幸的是,它似乎没有枚举器变量。看起来不同的类BinaryReader确实有这样的功能。

为什么要将2gb文件放入内存?您已经在使用
FileStream
,您可以使用它来流式处理块而不是完整的文件。这取决于您的意图。之后你打算怎么处理这个文件?一般的想法是读取一个小缓冲区,对其进行处理,然后读取下一个块。@VidmantasBlazevicius你能举个例子吗?AntonSizikov我需要使用webcliend@AaYy这里还有一个问题,关于如何以块而不是完整的方式读取文件,所以我只是将相同的代码重新发布在另一个注释上,如果您要在正文请求中发布2gb文件,那么您可能会遇到更大的问题。任何正常的HTTP服务器都不会在HTTP请求中接受大于2gb的正文。即使这样做,也可能会遇到请求超时问题。除非您已经知道您的服务器是为这一特殊事件设置的,否则您的方法本身可能有缺陷。除非您已启用,否则64位不允许大于2GB的阵列。@mjwills:谢谢。我完全忘记了额外的限制。