如何在C#中以最佳速度异步复制文件

时间:2017-07-13 16:06:42

标签: c# performance asynchronous

我正在使用此方法进行异步文件复制以及通知和取消。它适用于本地复制文件。但是在交叉驱动器复制的情况下,其性能会降低,因为每时每刻只有一个驱动器工作。当我将大文件从SSD复制到慢速闪存或反之亦然时,会出现最糟糕的情况。

任何人都能建议我更好的解决方案吗?也许某些基于生产者 - 消费者模式的东西或者有一些库? (我搜索过,但没有结果)

P.S。:它不是直接使用的方法 - 它包含在其他一些方法中,它准备文件列表并选择bufferSize

private static async Task<long> CopyFileAsync(
    [NotNull]string sourcePath,
    [NotNull]string destPath,
    [NotNull]IProgress<FileCopyProgress> progress, 
    CancellationToken cancellationToken,
    long bufferSize = 1024 * 1024 * 10
    )
{
    if (bufferSize <= 0)
    {
        throw new ArgumentException(nameof(bufferSize));
    }

    long totalRead = 0;
    long fileSize;
    var buffer = new byte[bufferSize];
    using (var reader = File.Open(sourcePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        fileSize = reader.Length;
        using (var writer = File.Create(destPath, Convert.ToInt32(bufferSize), FileOptions.Asynchronous))
        {
            while (totalRead < fileSize)
            {
                var readCount = await reader.ReadAsync(buffer, 0, Convert.ToInt32(bufferSize), cancellationToken).ConfigureAwait(false);
                await writer.WriteAsync(buffer, 0, readCount, cancellationToken).ConfigureAwait(false);
                totalRead += readCount;

                progress.Report(new FileCopyProgress(totalRead, fileSize, null));
                cancellationToken.ThrowIfCancellationRequested();
            }
        }
    }
    progress.Report(new FileCopyProgress(fileSize, fileSize, null));
    return fileSize;
}

0 个答案:

没有答案