封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度。

封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度等。

我的第一篇博客


前段时间无意间想到如何控制文件复制过程的复制速度,并且能实时获得复制进度。对于一个几兆甚至更小的文件,调用API函数CopyFile(Ex)来复制,很快就能完成的。然而对于一个几百兆的大文件来说,如果仍然采用调用同步CopyFileEx,那么函数将阻塞相当长的时间。并且对于大文件我更希望能知道复制的进度。为此,百度谷歌了很长时间(也曾在csdn发过帖子http://topic.csdn.net/u/20110730/16/8ebd7515-83f6-4868-8d7c-2d7a783cda8b.html在此感谢各位坛友的帮助),得知CopyFileEx这个函数能实现我的要求。因此用自己那点浅薄的C++知识对CopyFileEx函数进行了简单的封装,算是实现了自己的需求。今天把之前的代码整理了下,写在自己的csdn博客上,一来算是为自己整理下思路,锻炼下自己的文字描述能力,二来,也想获得各位前辈的指点,若能给那些和我当初一样迷茫的童鞋一个参考,实乃万幸。

想想这也是我自己的第一篇博客,菜鸟一个,不怕拍砖!吼吼!^_^ 

CopyFileEx函数原型
BOOL WINAPI CopyFileEx(
  __in      LPCTSTR lpExistingFileName,
  __in      LPCTSTR lpNewFileName,
  __in_opt  LPPROGRESS_ROUTINE lpProgressRoutine,
  __in_opt  LPVOID lpData,
  __in_opt  LPBOOL pbCancel,
  __in      DWORD dwCopyFlags
);
前两个参数很容易明白,既然是复制文件的函数肯定要有源文件和目标文件了。第三个参数是一个回调函数的地址,在复制过程中,每当复制完成一块数据之后便调用一次,回调函数返回后再继续复制过程。如果再回调函数中让线程Sleep()一定的时间,便能减缓整个复制过程的速度,在回调函数中让线程暂定也就能暂停整个复制过程了。第四个数lpData是传给回调函数的参数,可以将在回调函数中需要修改的数据通过指针的方式传入。lpCancel:函数在执行过程中会不断的检测它指向的数值,一旦为TRUE便会取消复制过程。因此,可以用它来实现复制的停止。最后一个参数指示函数执行过程中的一些其它行为,不是非常关心,这里不在赘述。
对于回调函数
WORD CALLBACK CopyProgressRoutine(
  __in      LARGE_INTEGER TotalFileSize,
  __in      LARGE_INTEGER TotalBytesTransferred,

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
红外控制电机转速的代码一般分为两部分:红外接收部分和电机控制部分。 红外接收部分: 1. 首先需要定义红外接收引脚和电机控制引脚的端口号,例如: ``` sbit IRIN=P3^2; //红外接收引脚 sbit ENA=P1^0; //电机使能引脚 sbit ENB=P1^1; sbit IN1=P1^2; //电机控制引脚 sbit IN2=P1^3; ``` 2. 然后需要编写红外接收函数,例如: ``` void IR_receive() { unsigned char i=0; unsigned char j=0; unsigned char k=0; unsigned char IR_data[4]={0}; while(IRIN==1); //等待低电平 while(IRIN==0); //等待高电平 for(i=0;i<4;i++) { for(j=0;j<8;j++) { while(IRIN==1); //等待低电平 while(IRIN==0); //等待高电平 delay_us(1); if(IRIN==1) { IR_data[i]|=(0x01<<(7-j)); while(IRIN==1); //等待低电平 } } } if(IR_data[2]==(~IR_data[3])) { switch(IR_data[2]) { case 0x18: //按键1 IN1=1; IN2=0; break; case 0x08: //按键2 IN1=0; IN2=1; break; case 0x1C: //按键3 IN1=1; IN2=1; break; case 0x5A: //按键4 ENA=0; ENB=0; break; case 0x52: //按键5 ENA=1; ENB=1; break; } } } ``` 这个函数的作用是接收红外信号,并根据不同的按键控制电机的转速和方向。 电机控制部分: 1. 首先需要定义电机控制函数,例如: ``` void motor_control(unsigned char speed) { TH0=256-speed; //设置定时器初值 TL0=256-speed; TR0=1; //启动定时器 } ``` 这个函数的作用是根据传入的速度值控制电机的转速。 2. 然后需要编写定时器函数,例如: ``` void timer0() interrupt 1 { static unsigned char count=0; count++; if(count>=10) //每10个定时器断周期改变一次电机状态 { count=0; IN1=!IN1; IN2=!IN2; } } ``` 这个函数的作用是定时改变电机的状态,从而控制电机的转速和方向。 最后,在主函数需要启动定时器和红外接收功能,例如: ``` void main() { TMOD=0x01; //定时器0工作在模式1 TH0=0; TL0=0; ET0=1; //允许定时器0断 EA=1; //开启总断 while(1) { IR_receive(); //接收红外信号 motor_control(100); //控制电机转速 } } ``` 这样就完成了红外控制电机转速的代码。如果需要更详细的代码实现,可以参考一些相关的开源项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值