我正在构建一个允许用户从URL下载文件的库.我正在考虑的一个选项是让用户为文件指定预期的MD5校验和;库的GetFile(string url)函数确保下载的流的校验和与用户指定的校验和匹配.
知道HttpWebResponse.GetResponseStream()返回的NetworkStream是不可寻的,我找到了一种复制流的方法,这要归功于这个问题的答案:How can I read an Http response stream twice in C#?.在我走得更远之前,我想弄清楚内存含义是什么这种重复将是;不幸的是,Google和MSDN上的多次搜索都化为乌有.
该库对要下载的文件的大小没有限制.我的问题是,如果用户选择2GB文件,.NET 2.0中的MemoryStream实现是否足够智能,足以有效地使用PageFile和RAM,系统不会因VM崩溃而开始爬行?此外,Jon Skeet对另一个问题的评论给了我一些思考 – 他断言即使在处理了MemoryStream后,内存也不是100%免费的.我如何以及何时确保实际释放内存?它会根据系统的要求(和必要性)发布吗?
谢谢,
马诺
解决方法:
你将它保存到文件中,对吧?为什么不按块保存块,随时更新哈希,然后只检查最后的哈希值?我认为您不需要两次读取响应,也不需要缓冲它.正如另一个答案指出的那样,无论如何当你超过1GB时,这将失败.
不要忘记它以及MemoryStream的当前大小,任何时候它必须增长,你最终会(暂时)结束新数组加上内存中的旧数组.当然,如果您事先知道内容长度,这不会是一个问题,但是将它写入磁盘和散列仍然会更好.