2011-04-17 50 views
4

System.Net.WebClient.DownloadFile()是以块读取下载的文件,还是将整个文件读取到内存中,最后将其转储到磁盘上? 有人知道吗?从我的测试看来,文件是用0字节立刻创建的,然后一旦下载完成就爆炸为全尺寸。但不知何故,这很难相信,因为这意味着下载2GB文件时会占用2GB的内存......这是毫无意义的。System.Net.WebClient.DownloadFile()以块的形式读取下载的文件?

+0

下载文件时,IE不会做同样的事吗?我没有支持这种推测的链接,但我想它是写入由框架(用户数据某处)控制的临时位置,然后在下载完成时移动到目标文件(其中有0字节的占位符) 。再一次,只是猜测。 (因此,不是一个答案。) – David 2011-04-17 00:09:56

回答

2

它将任何直接收到的内容写入FileStream。 DownloadBitsState.RetrieveBytes() method,WriteStream.Write()调用如果你想用反射器或参考源看看。在文件关闭之前,size属性不会在资源管理器中更新。

+0

如果你使用Reflector()查看它,我相信你。我现在只希望MONO的行为一样。谢谢! – Krumelur 2011-04-17 00:20:29

0

Web响应直接传输到文件中;它不会将整个事物缓冲到记忆中。该方法阻塞线程直到整个文件被下载。您可以使用DownloadFileAsync()异步下载它。

+0

是的,从阅读文件,这就是我所知道的。但它并没有说它在写入磁盘之前是否使用内存来缓冲整个下载。 – Krumelur 2011-04-17 00:23:00

1

通过查看反汇编代码(assembly System,Version = 4.0.0.0),我发现了以下内容:方法DownloadFile()使用参数asyncOp = null调用方法DownloadBits()以下载文件。下载完成后,该方法以byte []形式返回整个下载的文件。因此,内存被浪费了,并且可能遇到大文件的问题。