C# 读取大文件
我尝试用两种方式读取2+gb文件,第一种: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
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:谢谢。我完全忘记了额外的限制。