LenovoLegionToolkit
37 строк · 1.3 Кб
1using System;2using System.IO;3using System.Threading;4using System.Threading.Tasks;5
6namespace LenovoLegionToolkit.Lib.Extensions;7
8// ReSharper disable LocalizableElement
9
10public static class StreamExtensions11{
12public static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress<long>? progress = null, CancellationToken cancellationToken = default)13{14if (source is null)15throw new ArgumentNullException(nameof(source));16if (!source.CanRead)17throw new ArgumentException("Has to be readable", nameof(source));18
19if (destination is null)20throw new ArgumentNullException(nameof(destination));21if (!destination.CanWrite)22throw new ArgumentException("Has to be writable", nameof(destination));23if (bufferSize < 0)24throw new ArgumentOutOfRangeException(nameof(bufferSize));25
26var buffer = new byte[bufferSize];27long totalBytesRead = 0;28int bytesRead;29
30while ((bytesRead = await source.ReadAsync(buffer, cancellationToken).ConfigureAwait(false)) != 0)31{32await destination.WriteAsync(buffer.AsMemory(0, bytesRead), cancellationToken).ConfigureAwait(false);33totalBytesRead += bytesRead;34progress?.Report(totalBytesRead);35}36}37}
38