public static async Task CopyToAsync(this Stream src, Stream target, long count, int bufferSize) { Validation.RequireValidBufferSize(bufferSize); var bytesCopied = 0L; var buffer = new byte[bufferSize]; while (bytesCopied < count) { var desiredBytesToCopy = (int)Math.Min(buffer.Length, count - bytesCopied); var actualBytesToCopy = await src.ReadAsync(buffer, 0, desiredBytesToCopy); if (actualBytesToCopy == 0) { throw new EndOfStreamException("Unexpected end of source stream"); } await target.WriteAsync(buffer, 0, actualBytesToCopy); bytesCopied += actualBytesToCopy; } }
public static async Task WriteAsync(this Stream stream, byte[] data, int bufferSize) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (data == null) { throw new ArgumentNullException(nameof(data)); } Validation.RequireValidBufferSize(bufferSize); var bytesWritten = 0; while (bytesWritten < data.Length) { var remain = data.Length - bytesWritten; var bytesToWrite = Math.Min(remain, bufferSize); await stream.WriteAsync(data, offset : bytesWritten, count : bytesToWrite); bytesWritten += bytesToWrite; } }