为什么FileStream和CopyFile比Windows资源管理器慢得多?

Sof*_*Kng 4 windows performance copy filestream file-copying

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

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

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

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

Mic*_*ims 5

我不知道你是否还在经历这个问题,但我已经和这个问题搏斗了好几天,所以我想我会发布这个.我终于找到了一个与Explorer复制例程相当的解决方案.我不知道,如果这个工程的FileStream,但我能够使用CopyFileCopyFileEx得到相同的性能.就我而言,CopyFileEx是一个更好的选择,因为我想要一个进步回调.使用进程监视器来检查复制过程后,我注意到,该系统重置前的数据流位置(即使它没有移动)每一个读取并为每个32K块拷贝(因此表现不佳)写操作.在任何一种情况下,密钥都是FileIOPermission在开始复制操作之前使用源文件和目标文件设置IO权限.

以下是我的代码中的相关摘录:

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);
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

请参阅此处MSDN 对该标志的描述。

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