我正在构建一个ASP.NET Core应用程序,需要处理大文件上传,最多达200GB。我的目标是将这些文件写入磁盘并同时捕获MD5哈希值。
我已经按照使用流进行大文件上传中的说明创建了自己的方法来识别来自HTTP客户端请求的文件流。一旦我找到了流,我将使用下面的代码来将其写入磁盘并创建MD5哈希值。
很棒的是上述代码可以正常运行(文件已创建且哈希已生成)。但不太好的是我并没有完全理解它是如何工作的:
我已经按照使用流进行大文件上传中的说明创建了自己的方法来识别来自HTTP客户端请求的文件流。一旦我找到了流,我将使用下面的代码来将其写入磁盘并创建MD5哈希值。
// removed the curly brackets from using statements for readability on Stack Overflow
var md5 = MD5.Create();
using (var targetStream = File.OpenWrite(pathAndFileName))
using (var cryptoStream = new CryptoStream(targetStream, md5, CryptoStreamMode.Write))
using (var sourceStream = fileNameAndStream.FileStream)
{
await sourceStream.CopyToAsync(cryptoStream);
}
var hash = md5.Hash;
md5.Dispose();
很棒的是上述代码可以正常运行(文件已创建且哈希已生成)。但不太好的是我并没有完全理解它是如何工作的:
cryptoStream
是被复制到targetStream
中然后写入吗?cryptoStream
是在内存中保留字节还是按需读取?cryptoStream
和targetStream
都是异步发生的吗?- 还是将数据异步复制到
cryptoStream
,然后同步写入到targetStream
中?
FileStream
(因为底层的 Windows API 就是这样工作的)。此外,CryptoStream
并不执行异步 IO(甚至任何 IO),它只是将异步调用代理到目标流。 - Evk