C# 如何在C中以最佳速度异步复制文件#
我使用此方法异步复制带有通知和取消的文件。它适用于本地复制文件。但在交叉驱动器复制的情况下,其性能会降低,因为每时每刻只有一个驱动器工作。最糟糕的情况发生在我将大文件从SSD复制到慢速闪存时,反之亦然 有谁能建议我更好的解决办法吗?也许是基于生产者-消费者模式,或者有一些库?(我已经搜索过了,但没有结果) 注意:这不是直接使用的方法-它被包装在其他一些方法中,用于准备文件列表并选择缓冲区大小C# 如何在C中以最佳速度异步复制文件#,c#,performance,asynchronous,C#,Performance,Asynchronous,我使用此方法异步复制带有通知和取消的文件。它适用于本地复制文件。但在交叉驱动器复制的情况下,其性能会降低,因为每时每刻只有一个驱动器工作。最糟糕的情况发生在我将大文件从SSD复制到慢速闪存时,反之亦然 有谁能建议我更好的解决办法吗?也许是基于生产者-消费者模式,或者有一些库?(我已经搜索过了,但没有结果) 注意:这不是直接使用的方法-它被包装在其他一些方法中,用于准备文件列表并选择缓冲区大小 private static async Task<long> CopyFileAsync(
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;
}
private静态异步任务CopyFileAsync(
[NotNull]字符串源路径,
[NotNull]字符串路径,
[NotNull]我正在进步,
CancellationToken CancellationToken,
长缓冲区大小=1024*1024*10
)
{
如果(bufferSize为什么不直接使用文件。Copy
?如果先将数据加载到程序内存中,复制不会更快。异步操作意味着您不必等待操作完成,而不是等待操作运行得更快。从一个di复制时,您无法获得比磁盘所能提供的性能更好的性能两个驱动器都可以工作,除非文件太小,操作系统只能将整个文件缓冲在内存中。文件有多大?如果文件太小,可以并行复制多个文件1)可以同时复制多个会话2)我需要看到进展,因为典型的数据量大约是10-100Gb一次3)据我所知,在当前的情况下,驱动器A读取时,驱动器B无法写入,而在典型的数据块中,大约有1000个文件,其中大多数文件小于1MB,但从1到10个文件都很大-从1-50GB,你认为这是为什么?当你从Windo复制文件时ws-Explorer您确实看到两个驱动器都在工作。顺便说一句,1MB足够小,可以放入处理器的缓存中。它肯定足够小,可以在复制之前在内存中进行缓冲。这可以让您看起来只有一个驱动器在工作