我正在构建一个库,允许用户从 URL 下载文件。我正在考虑的选项之一是让用户指定文件的预期 MD5 校验和;该库的 GetFile(string url) 函数可确保下载的流的校验和与用户指定的校验和相匹配。
意识到 HttpWebResponse.GetResponseStream() 返回的 NetworkStream 不可查找,由于这个问题的答案,我找到了一种复制流的方法:如何在 C# 中读取 Http 响应流两次? https://stackoverflow.com/questions/147941/how-can-i-read-an-http-response-stream-twice-in-c。不过,在继续之前,我想弄清楚这种重复对记忆的影响是什么;不幸的是,在Google和MSDN上的多次搜索都没有结果。
该库对要下载的文件的大小没有限制。我的问题是,如果用户选择 2GB 文件,.NET 2.0 中的 MemoryStream 实现是否足够智能,能够足够高效地使用页面文件和 RAM,从而使系统不会因 VM 紧缩而开始爬行?另外,Jon Skeet 对另一个问题的评论给了我一些思考 - 他断言即使在处理 MemoryStream 之后,内存也不会 100% 释放。如何以及何时才能确保内存真正被释放?会根据系统的要求(和必要性)发布吗?
谢谢,
马诺伊
您将其保存到文件中,对吧?为什么不逐块保存它,边更新哈希值,然后在最后检查哈希值呢?我认为您不需要两次读取响应,也不需要缓冲它。正如另一个答案指出的那样,无论如何,当你超过 1GB 时,这都会失败。
不要忘记以及当前的大小MemoryStream
,任何时候它必须增长,你最终都会(暂时)得到新的数组plus同时内存中的旧数组。当然,如果您事先知道内容长度,那不会有问题,但最好将其写入磁盘并进行哈希处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)