求助:VC++实现快速磁盘拷贝

中原娇客 2014-08-20 04:57:42
各位大侠:碰到一个工程要求将512G的电子盘数据在3分钟之内拷贝到另外一个512G的电子盘上,用VC++实现由可行性么?如果有,能否告知实现方法?用一个第三方软件的API实现也可以。 烦各位前辈不辞辛劳,给予指导。谢谢!
...全文
555 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
b971049 2014-10-26
  • 打赏
  • 举报
回复
注意事项: 1、因为用CreateFile打开的源和目标都是卷,所以都只能采用无缓冲方式。 2、源盘可以采用同步方式(即常规方式)打开,目标必须采用异步方式打开,避免无谓的等待。这样的好处是每次从源盘读到数据后底层向目标盘发出写命令WriteFile函数就直接返回,不会等待写命令完成,这时候可以马上从源盘读下一块数据。注意每次写数据之前都要用WaitForSingleObject等待上一次写操作完成。 3、电子盘有一个最优的读写块大小(通常是2的幂且通常大于等于4k Byte),每次以该大小读写速度最快,这个可以编程试验一下,如果不想试验,可以用1M Byte,最后一块不满一兆需要特殊处理一下。
b971049 2014-10-26
  • 打赏
  • 举报
回复
引用 21 楼 zhongyuanjiaoke 的回复:
[quote=引用 16 楼 b971049 的回复:] 电子盘没有文件系统?是RAW格式吗?可以直接用CreateFile打开磁盘读写。如果有文件系统,就递归搜索文件复制到第二块盘上,这样如果第一块盘不满可以少拷一些数据。我做的一些小实用程序两种方法都用过,基本上都能达到硬件的速度极限。
电子盘上只有一些裸数据,没有文件系统,我用CreateFile实现过,可惜速度达不到;512G内容要求30分钟拷贝完成:(。[/quote] 如果是裸数据,是可以用CreateFile,速度可以达到硬件速度极限。
sunnysab 2014-10-26
  • 打赏
  • 举报
回复
debian下向U盘的拷贝速度比在windows7下高一倍……不知道怎么回事。同一个U盘
赵4老师 2014-10-20
  • 打赏
  • 举报
回复
搜“卷影复制”
zwfgdlc 2014-10-20
  • 打赏
  • 举报
回复
CreateFile函数dwFlagsAndAttributes参数加上FILE_FLAG_NO_BUFFERING,写入速度会有30%以上的性能提升
sichuanwww 2014-10-20
  • 打赏
  • 举报
回复
zwfgdlc 2014-10-20
  • 打赏
  • 举报
回复
试下用fastcopy行不行,fastcopy是开源的
中原娇客 2014-10-20
  • 打赏
  • 举报
回复
好纠结啊,WINHEX能实现的东东,我却找不到方法;各位,击鼓加油啊!团结就是力量,希望问题能够解决
中原娇客 2014-10-20
  • 打赏
  • 举报
回复
引用 16 楼 b971049 的回复:
电子盘没有文件系统?是RAW格式吗?可以直接用CreateFile打开磁盘读写。如果有文件系统,就递归搜索文件复制到第二块盘上,这样如果第一块盘不满可以少拷一些数据。我做的一些小实用程序两种方法都用过,基本上都能达到硬件的速度极限。
电子盘上只有一些裸数据,没有文件系统,我用CreateFile实现过,可惜速度达不到;512G内容要求30分钟拷贝完成:(。
b971049 2014-10-19
  • 打赏
  • 举报
回复
另外,除非设备是多口的,各口可以并行读写,千万不要使用多线程加速,否则由于多线程访问仲裁和寻址的问题,通常反而造成读写速度急剧下降。注意要使用异步文件操作,使读和写并行起来。
b971049 2014-10-19
  • 打赏
  • 举报
回复
电子盘没有文件系统?是RAW格式吗?可以直接用CreateFile打开磁盘读写。如果有文件系统,就递归搜索文件复制到第二块盘上,这样如果第一块盘不满可以少拷一些数据。我做的一些小实用程序两种方法都用过,基本上都能达到硬件的速度极限。
笨笨仔 2014-10-19
  • 打赏
  • 举报
回复
其实问题的”瓶颈“不在软件,我们知道写入设备的数据是由串行方式写入,而一个设备只有一个进口,需要快就必须提高流量,但这总是受到种种制约。 高速读写唯一的解决方式是使用”阵列“,将数据分成多段,多个口同时写入才是王道。
中原娇客 2014-10-19
  • 打赏
  • 举报
回复
如果各位友人某天能够通过编程的方法实现该功能,一定要分享一下。这个难题已经困扰我好久了
中原娇客 2014-10-19
  • 打赏
  • 举报
回复
引用 10 楼 lx624909677 的回复:
[quote=引用 8 楼 zhongyuanjiaoke 的回复:] 真心的向各位发言人道歉,因为我的错误“将512G的电子盘数据在30分钟之内拷贝到另外一个512G的电子盘上”错写成了3分钟,真心不是故意的。。。追悔莫及啊、各位多包容
恭喜啊,问题解决了[/quote] 其实问题没有解决,我虽然用WINHEX验证了电子盘的读写速度,但自己用编程的方法却未能实现 :(
「已注销」 2014-08-30
  • 打赏
  • 举报
回复
不可能吧,硬盘服务器呀
lx624909677 2014-08-29
  • 打赏
  • 举报
回复
引用 8 楼 zhongyuanjiaoke 的回复:
真心的向各位发言人道歉,因为我的错误“将512G的电子盘数据在30分钟之内拷贝到另外一个512G的电子盘上”错写成了3分钟,真心不是故意的。。。追悔莫及啊、各位多包容
恭喜啊,问题解决了
encoderlee 2014-08-28
  • 打赏
  • 举报
回复
512G的数据30分钟拷贝到另一个盘上,也就是说拷贝速度约为300MB/S。 目前固态硬盘确实可以达到这个速度。但机械硬盘读写速度一般都不超过150M/s。 如果是在机械硬盘上实现的话,我觉得一个合理的解释就是该软件对冗余数据进行了处理, 比如硬盘上的空白区域、空白文件、连续的相同数据等。实际上就是一个压缩、传输、解压的过程
中原娇客 2014-08-28
  • 打赏
  • 举报
回复
真心的向各位发言人道歉,因为我的错误“将512G的电子盘数据在30分钟之内拷贝到另外一个512G的电子盘上”错写成了3分钟,真心不是故意的。。。追悔莫及啊、各位多包容
中原娇客 2014-08-28
  • 打赏
  • 举报
回复
谢谢各位踊跃发言,我用了WIN HEX第三方软件的磁盘克隆功能尝试了下读写速度,512G的数据量用了29分钟的时间完成了磁盘克隆,不知道是怎么实现的.......
wqvbjhc 2014-08-21
  • 打赏
  • 举报
回复
帮LZ算了下,这样的硬盘读写速度必须>=2.82GB/s. 我也想见识一下这样的硬盘。
加载更多回复(5)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧