我正在尝试通过网络(从 Windows Server 2008 R2 到 Windows 7 SP1 Enterprise)复制文件,当我使用 Windows 资源管理器进行拖放时,速度大约为 4.5 MB/秒。 (这是 WAN 连接)
但是,当我使用 FileStream.Read() 时,我只能获得大约 1.5 MB/秒的速度。我尝试过从 1 KB 到 4 MB 不等的不同缓冲区大小。我也尝试过使用 CopyFile() 和 CopyFileEx(),但我得到了相同的结果。
这里可能发生了什么,我该如何修复我的代码?
编辑:我也尝试过使用 TeraCopy(第 3 方工具),它也只能获得 1.5 MB/s。
最佳答案
我不知道你是否仍然遇到这个问题,但我已经为这个问题苦苦挣扎了好几天,所以我想我会发布这个。我终于找到了一个与 Explorer 复制例程不相上下的解决方案。我不知道这是否适用于 FileStream
,但我是能够使用 CopyFile
或 CopyFileEx
来获取相同的性能。在我的例子中,CopyFileEx
是更好的选择,因为我想要一个进度回调。在使用 Process Monitor 检查复制过程后,我注意到系统在为每个 32k block 复制的每个读写操作之前重置流位置(即使它没有移动)(因此表现不佳)。在任何一种情况下,关键是在开始复制操作之前使用 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);
}
希望对您有所帮助。试图弄清楚发生了什么让我发疯。
关于windows - 为什么 FileStream 和 CopyFile 比 Windows Explorer 慢这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16468510/