4

我正在尝试通过网络复制文件(Windows Server 2008 R2 到 Windows 7 SP1 Enterprise),当我使用 Windows 资源管理器拖放时,我得到大约 4.5 MB/s。(这是一个广域网连接)

但是,当我使用 FileStream.Read() 时,我只能得到大约 1.5 MB/s。我尝试了从 1 KB 到 4 MB 的不同缓冲区大小。我也尝试过使用 CopyFile() 和 CopyFileEx() 但我得到了相同的结果。

这里可能发生了什么,我该如何修复我的代码?

编辑:我也尝试过使用 TeraCopy(第 3 方工具),它也只有 1.5 MB/s。

4

2 回答 2

5

我不知道你是否仍然遇到这个问题,但我已经为这个问题挣扎了好几天,所以我想我会发布这个。我终于找到了一个可以与 Explorer 复制例程相媲美的解决方案。我不知道这是否适用FileStream,但我能够使用CopyFileCopyFileEx获得相同的性能。就我而言,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);
}

希望这会有所帮助。它让我疯狂地试图弄清楚发生了什么。

于 2013-12-13T21:51:55.817 回答
4

我的解决方案是禁用 CopyFileEx 的 COPY_FILE_RESTARTABLE 标志。删除该标志后,我的速度大约提高了 4-5 倍。

请在此处查看 MSDN 对该标志的描述。

在复制失败的情况下,在目标文件中跟踪复制的进度...这会显着减慢复制操作,因为在复制操作期间可能会多次刷新新文件。

于 2017-01-27T00:01:52.353 回答