如何在.NET中下载大文件(通过HTTP)?我需要在C#控制台应用程序中通过HTTP下载一个大文件(2GB)。问题是,在大约1.2GB之后,应用程序内存不足。这是我正在使用的代码:WebClientrequest=newWebClient();request.Credentials=newNetworkCredential(用户名,密码);byte[]fileData=request.DownloadData(baseURL+fName);如您所见...我正在将文件直接读入内存。如果我要从块中读取数据并将其写入磁盘上的文件,我很确定我可以解决这个问题。我怎样才能做到这一点?如果您使用WebClient.DownloadFile,则可以将其直接保存到文件中。WebClient类是简化解决方案的类。一旦您通过了简单的场景(并且您已经通过),您将不得不退后一步并使用WebRequest。使用WebRequest,您将可以访问响应流,并且可以遍历它,读取一些内容并写入一些内容,直到完成为止。示例:publicvoidMyDownloadFile(Uriurl,stringoutputFilePath){constintBUFFER_SIZE=16*1024;使用(varoutputFileStream=File.Create(outputFilePath,BUFFER_SIZE)){varreq=WebRequest.Create(url);使用(varresponse=req.GetResponse()){使用(varresponseStream=response.GetResponseStream()){varbuffer=newbyte[BUFFER_SIZE];intbytesRead;做{bytesRead=responseStream.Read(buffer,0,BUFFER_SIZE);outputFileStream.Write(buffer,0,bytesRead);}while(bytesRead>0);请注意,如果WebClient.DownloadFile有效,那么我将其称为最佳解决方案。我在上传“下载文件”答案之前写了上面的内容。我也是在一大早写这篇文章,所以它可能需要一点盐(和测试)。您需要获取响应流,然后分块读取,将每个块写入文件以允许内存重用。如您所写,整个响应,全部2GB,都需要在内存中。即使在64位系统上,单个.NET对象也会达到2GB的限制。更新:更简单的选择。让WebClient为您完成工作:使用DownloadFile方法将数据直接放入文件中。WebClient.OpenRead返回一个Stream,只是用Read循环遍历内容,所以数据不会缓存在内存中,而是可以分块写入文件。我会使用这样的东西连接可能会断开,所以最好分小块下载文件。Akka流可以帮助使用多线程从System.IO.Stream下载小块文件。https://getakka.net/articles/intro/what-is-akka.html下载方法将字节附加到以长fileStart开头的文件。如果文件不存在,则fileStart值必须为0。以上是C#学习教程:Howtodownloadlargefiles(viaHTTP)in.NET?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——usingAkka.Actor;使用Akka.IO;使用Akka.Streams;使用Akka.Streams.Dsl;使用Akka.Streams.IO;privatestaticSink>FileSink(stringfilename){returnFlow.Create().ToMaterialized(FileIO.ToFile(newFileInfo(filename),FileMode.Append),Keep.Right);}privateasyncTaskDownload(stringpath,Uriuri,longfileStart){使用(varsystem=ActorSystem.Create("system"))使用(varmaterializer=system.Materializer()){HttpWebRequestrequest=WebRequest.创建(uri)作为HttpWebRequest;要求。添加范围(文件开始);使用(WebResponseresponse=request.GetResponse()){Streamstream=response.GetResponseStream();awaitStreamConverters.FromInputStream(()=>stream,chunkSize:1024).RunWith(FileSink(path),materializer);}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
