在处理大型流时,例如超过 4GB 的文件 - 您不想将文件加载到内存中(作为 a Byte[]
),因为它不仅速度很慢,而且即使在 64 位进程中也可能导致崩溃Byte[]
不能超过 2GB(或 4GB,带gcAllowVeryLargeObjects
)。
幸运的是,.NET 中有一个简洁的助手,ToBase64Transform
它以块的形式处理流。出于某种原因,Microsoft 将其放入System.Security.Cryptography
并实现ICryptoTransform
(用于与 一起使用CryptoStream
),但忽略它(“任何其他名称的玫瑰......”)只是因为您没有执行任何加密任务。
你像这样使用它CryptoStream
:
using System.Security.Cryptography;
using System.IO;
//
using( FileStream inputFile = new FileStream( @"C:\VeryLargeFile.bin", FileMode.Open, FileAccess.Read, FileShare.None, bufferSize: 1024 * 1024, useAsync: true ) ) // When using `useAsync: true` you get better performance with buffers much larger than the default 4096 bytes.
using( CryptoStream base64Stream = new CryptoStream( inputFile, new ToBase64Transform(), CryptoStreamMode.Read ) )
using( FileStream outputFile = new FileStream( @"C:\VeryLargeBase64File.txt", FileMode.CreateNew, FileAccess.Write, FileShare.None, bufferSize: 1024 * 1024, useAsync: true ) )
{
await base64Stream.CopyToAsync( outputFile ).ConfigureAwait(false);
}