4GB を超えるサイズのファイルなどの大きなストリームを処理する場合、ファイルを ( として) メモリにロードしたくありません。Byte[]
これは、非常に遅いだけでなく、64 ビット プロセスでもクラッシュが発生する可能性があるためです。Byte[]
2GB (または の場合は 4GB gcAllowVeryLargeObjects
) を超えることはできません。
さいわい、.NETToBase64Transform
には、ストリームをチャンクで処理する というきちんとしたヘルパーがあります。何らかの理由で 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);
}