VC++ 如何控制复制文件的速度

Career2011 2011-07-30 04:59:29
1.首先,用c++实现文件拷贝的一般方法是什么?我是这样想的:打开文件,读取一块,然后写入新文件,以此循环,直到完成。不知道这样的方法是否是最好的方法?每次操作的缓冲区应该设置多大才能使效率最高?

2.windows的api中有CopyFile() 这个函数,直接传入源文件和目标文件的路径就解决问题了。但是貌似没法知道拷贝的进度,特别对于大文件,需要一段时间才能拷贝完成,而且没法实现拷贝的速度。

3.如果采用第一种方案,通过记录已读取文件的大小可以知道进度,复制过程在循环里面让线程sleep()一定时间也能控制速度了,这是我想到的。不过总觉得应该有更好的方法来实现。所以在此请教大家,谢谢
...全文
683 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Career2011 2011-08-10
  • 打赏
  • 举报
回复
不好意思,有很长时间没结贴了~
maquan 2011-08-04
  • 打赏
  • 举报
回复
从你描述的这个做法,本身看不出有什么问题。Sleep() 作为调试用可以,实际不能这样用,否则主界面还是要卡死,新线程就没啥意义了。

只是,你把 this 传给新线程,然后在新线程中访问其成员,这就有潜在的线程访问冲突的问题,你有什么同步之类的措施吗?如果有的话,你的主线程处在休眠状态,会不会死锁了?

改用全局变量是可以的,也可以用 new 创建对象,传给线程后,线程结束前释放它。


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
Career2011 2011-08-04
  • 打赏
  • 举报
回复
问题解决了。
前面我说过,我想把我这些封装成一个简单的类。实例是在按钮事件函数中定义的。然后传入相关参数,调用类的StartCopy()函数。在这个函数中,创建线程,线程中再调用CopyFileEx函数。这中间用到了两个回调函数。为了保证类的封装。我将这另个函数都写成了类的静态成员函数(这方法也是以前在网上看到的),线程的函数传入的参数是this指针。这样便能往CopyFileEx函数中传入类的成员变量作为参数。

为了防止按钮事件函数返回,局部变量析构,我特意在返回之间Sleep(10000);以便测试。这样就导致了上述情况。
这次我用的全局变量。然后在按钮实践函数中调用StartCopy就没问题了。

虽然问题解决了。但是问题具体出现在什么地方我还是不太明白啊。
有人能看看这些吗?
Waistcoat23 2011-08-04
  • 打赏
  • 举报
回复
不好意思没看MSDN,CopyFileEx是同步的

你看下CopyFileEx返回值是否成功?如果失败GetLastError看看啥错误

还有你CopyFileEx的参数都咋写的?
Career2011 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 waistcoat23 的回复:]

估计是你线程先退出了,当然拷贝动作也就被终止了。
[/Quote]
首先貌似这个函数不是异步的吧。
在线程中,我在调用CopyFileEx之后,再Sleep(4000),结果还是一样的。如果说你是因为线程退出导致的话,这样回调函数总不可能只被调用一次了吧?
我感觉是不是因为我回调函数传入的问题呢?
Waistcoat23 2011-08-03
  • 打赏
  • 举报
回复
估计是你线程先退出了,当然拷贝动作也就被终止了。
Torch009 2011-08-03
  • 打赏
  • 举报
回复
copyfileEx函数可以解决你的问题。具体用法网上查一下吧
Waistcoat23 2011-08-03
  • 打赏
  • 举报
回复
这个函数是异步的,你不用创建线程的
Career2011 2011-08-03
  • 打赏
  • 举报
回复
return PROGRESS_CONTINUE;
Waistcoat23 2011-08-03
  • 打赏
  • 举报
回复
回调函数返回值是啥?
Career2011 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 maquan 的回复:]


貌似你的调用已经成功了。

文件被正常拷贝了吗?如果不是你通过回调函数的返回值中止了拷贝……
[/Quote]
没有成功啊,20多M的文件。以下是在程序执行的时候的输出内容:

-----startcopy function
-----threadproc
---------copyfileex callback
CallBack Count0
TotalFileSize:27233759
TotalBytesTransferred:0
StreamSize:27233759
StreambytesTransferred:0
StreamNumber:1;CallBackReason:1

-----leave threadproc

///////////////////////
callback被调用一次线程就退出了。。。
maquan 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 career2011 的回复:]
还有一个问题哈,CopyFileEx函数不是会阻塞程序执行么?我新开一个线程,然后调用CopyFileEx,可是线程马上就退出了,貌似没有被CopyFileEx阻塞。而且可以看到CopyFileEx的回调函数只被调用了一次!这是怎么回事?还是我用错了。。[/Quote]
貌似你的调用已经成功了。

文件被正常拷贝了吗?如果不是你通过回调函数的返回值中止了拷贝过程,那么就是文件太小,一个 block 就完事儿了。


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
Career2011 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 waistcoat23 的回复:]

你回调函数咋写的?
[/Quote]
我想把这些东西都封装成一个类,线程函数和回调函数都是写成了类的静态成员函数,先创建线程,然后在线程函数中调用CopyFileEx传入的回调函数也就那个静态的CopyProgressRoutine。
难道这样做有问题吗?
按正常的调用方法是没出现过问题的!
Waistcoat23 2011-08-02
  • 打赏
  • 举报
回复
你回调函数咋写的?
Career2011 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 maquan 的回复:]

不知道你为什么要让文件复制减速,不过既然你想做,在 callback 里 sleep 应该能行。
[/Quote]
还有一个问题哈,CopyFileEx函数不是会阻塞程序执行么?我新开一个线程,然后调用CopyFileEx,可是线程马上就退出了,貌似没有被CopyFileEx阻塞。而且可以看到CopyFileEx的回调函数只被调用了一次!这是怎么回事?还是我用错了。。
maquan 2011-07-30
  • 打赏
  • 举报
回复
不知道你为什么要让文件复制减速,不过既然你想做,在 callback 里 sleep 应该能行。
Career2011 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 maquan 的回复:]

如果你只考虑 Windows 平台,那么 CopyFileEx() 就是你这 3 个问题的答案。

[/Quote]
你好,怎么用CopyFileEx()控制复制速度?
maquan 2011-07-30
  • 打赏
  • 举报
回复
如果你只考虑 Windows 平台,那么 CopyFileEx() 就是你这 3 个问题的答案。


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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