windows - 为什么 FileStream 和 CopyFile 比 Windows Explorer 慢这么多?

标签 windows copy filestream performance file-copying

我正在尝试通过网络(从 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,但我能够使用 CopyFileCopyFileEx 来获取相同的性能。在我的例子中,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/

相关文章:

python - 在 Python 脚本中使用 Windows GPS 定位服务

python - 避免在 numpy 和 mxnet 之间的数组转换期间进行复制

powershell - 替换powershell中变量的一部分而不替换其余部分?

.net - 我可以使用 FileStream 来实现文件锁定吗?

c++ - 丰富的编辑控件 : difference between rcPage and rc members of FORMATRANGE structure

windows - 将注册表值读取到批处理变量,处理值中的空格

javascript - 如何从azure数据库的表中删除行?

c++ - C/C++如何复制结构?

java - 将文件项转换为文件

c++ - 从使用 fmemopen() 打开的流中读取时的垃圾值