我不知道你是否仍然遇到这个问题,但我已经为这个问题挣扎了好几天,所以我想我会发布这个。我终于找到了一个可以与 Explorer 复制例程相媲美的解决方案。我不知道这是否适用FileStream
,但我能够使用CopyFile
或CopyFileEx
获得相同的性能。就我而言,CopyFileEx
这是一个更好的选择,因为我想要一个进度回调。在使用 Process Monitor 检查复制过程后,我注意到系统在每个 32k 块复制的每次读取和写入操作之前都重置了流位置(即使它没有移动) (因此性能很差)。无论哪种情况,关键是使用以下方法设置源文件和目标文件的 IO 权限FileIOPermission
在开始复制操作之前。
这是我的代码的相关摘录:
new FileIOPermission(FileIOPermissionAccess.Read, SourcePath).Demand();
new FileIOPermission(FileIOPermissionAccess.Write, DestinationPath).Demand();
if (!NativeCopy.CopyFileEx(SourcePath, DestinationPath,
new NativeCopy.CopyProgressRoutine(this.CopyProgressHandler), GCHandle.ToIntPtr(hArgs),
ref pbCancel, flags))
{
throw new IOException(new System.ComponentModel.Win32Exception().Message);
}
希望这会有所帮助。它让我疯狂地试图弄清楚发生了什么。