LenovoLegionToolkit

Форк
0
37 строк · 1.3 Кб
1
using System;
2
using System.IO;
3
using System.Threading;
4
using System.Threading.Tasks;
5

6
namespace LenovoLegionToolkit.Lib.Extensions;
7

8
// ReSharper disable LocalizableElement
9

10
public static class StreamExtensions
11
{
12
    public static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress<long>? progress = null, CancellationToken cancellationToken = default)
13
    {
14
        if (source is null)
15
            throw new ArgumentNullException(nameof(source));
16
        if (!source.CanRead)
17
            throw new ArgumentException("Has to be readable", nameof(source));
18

19
        if (destination is null)
20
            throw new ArgumentNullException(nameof(destination));
21
        if (!destination.CanWrite)
22
            throw new ArgumentException("Has to be writable", nameof(destination));
23
        if (bufferSize < 0)
24
            throw new ArgumentOutOfRangeException(nameof(bufferSize));
25

26
        var buffer = new byte[bufferSize];
27
        long totalBytesRead = 0;
28
        int bytesRead;
29

30
        while ((bytesRead = await source.ReadAsync(buffer, cancellationToken).ConfigureAwait(false)) != 0)
31
        {
32
            await destination.WriteAsync(buffer.AsMemory(0, bytesRead), cancellationToken).ConfigureAwait(false);
33
            totalBytesRead += bytesRead;
34
            progress?.Report(totalBytesRead);
35
        }
36
    }
37
}
38

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.