我正在使用此方法进行异步文件复制以及通知和取消。它适用于本地复制文件。但是在交叉驱动器复制的情况下,其性能会降低,因为每时每刻只有一个驱动器工作。当我将大文件从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;
}