在拷贝,删除文件时显示飞行的文件夹动画

可以很容易地调用API函数CopyFile, DeleteFile, 以及MoveFile来复制、删除、移动文件,这些功能相当容易使用,但是他们不显示飞行文件夹动画。下面是每一个API的例子。
//复制SOURCE.TXT到DEST.TXT,FALSE参数告诉windows如果文件DEST.TXT
//已经存在则复制失败,CopyFile的返回值是BOOL类型
if( CopyFile("C://SOURCE.TXT","C://DEST.TXT", FALSE) == FALSE)
MessageBox("CopyFile failed", "Error", MB_OK);
//如果移动或删除失败则返回FALSE
MoveFile("C://SOURCE.TXT","C://WINDOWS//TEMP//DEST.TXT");
DeleteFile("C://SOURCE.TXT");
这些功能很容易使用,但是不幸但是他们不显示飞行文件夹动画。为了显示动画,你必须使用SHFileOperation 这个API函数。下面是用SHFileOperation完成上面的操作的例子,注意复制和移动操作一定要指定目标文件夹。
//确认你包含了头文件SHELLAPI.H(这个文件地位置在INCLUDE/WIN32目录下)
#include <shellapi.h>
复制SOURCE.TXT到DEST.TXT;
char *From = "C://SOURCE.TXT/0";
char *To = "C://DEST.TXT/0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle; // 主窗体或应用程序的句柄
op.wFunc = FO_COPY;
op.pFrom = From;
op.pTo = To;
op.fFlags= 0;
SHFileOperation( &op);
移动SOURCE.TXT到windows的临时目录
char *From = "C://SOURCE.TXT/0";
char *To = "C://WINDOWS//TEMP/0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle;
op.wFunc = FO_MOVE;
op.pFrom = From;
op.pTo = To;
op.fFlags= 0;
SHFileOperation( &op);
把所有的临时文件删除到回收站
char *File = "C://windows//temp//*.TMP/0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle;
op.wFunc = FO_DELETE;
op.pFrom = File;
op.fFlags= FOF_ALLOWUNDO;
SHFileOperation( &op);
复制根目录所有的文本文件到临时目录。
char *From = "C://*.TXT/0";
char *To = "C://WINDOWS//TEMP/0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle;
op.wFunc = FO_COPY;
op.pFrom = From;
op.pTo = To;
op.fFlags= 0;
SHFileOperation( &op);
注意:
1:当你指定FO_DELETE操作的时候,如果fFlags包含FOF_ALLOWUNDO,文件将送到回收站,否则它们将被删除.
2:op结构的项目pFrom和pTo是字符指针,而不是数组.它们必须指向一个字符串,因为结构不含有任何存储空间,不能这样做:
op.pFrom = "C://*.TXT";
op.pTo = "C://TEMP";
3:在文件名字符串中注意到额外的终止符0(在字符串中的'/0')。MSDN文档表明pTo和pFrom字符串一定是双重零结束。
4:pFrom和pTo指向的内存可以包含多个字符串,字符串之间用0分隔,最后也要用双重0结束,下面是一个例子:
char *From = "C://*.txt/0C://*.log/0C://*.tmp/0";
op.pFrom = From;
//也可以用空白分隔
char *From = "C://*.txt/0"
"C://*.log/0"
"C://*.tmp/0";
5:当复制或者移动文件的时候,在fFlags参数中包含FOF_RENAMEONCOLLISION将阻止函数改写现存的文件,shell将建立名字叫做“复件 原文件名”的复制品(资源管理器就是这样做的).
6:你能也指定FO_RENAME作为wFunc参数.fFlags参数能包含很多其它高级方式,更多信息请参阅WIN32.HLP文件.
一个简单的例子:
BOOL CCopyDlg::OnBtnCopy()
{
       char FromFileName[80]="/0";
       char ToFileName[80]="/0";
       CString from = "C://duanpian//大海.264";
       CString to = "D://音乐//";
       strcpy(FromFileName,from);
       strcpy(ToFileName,to);
//strrchr查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符
       char *pos=strrchr(FromFileName,'//');
       pos=pos+1;                          
       strcat(ToFileName,pos); //将文件名"大海.264"加在目的路径后面,对文件命名
       strcat(FromFileName,"/0");
       strcat(ToFileName,"/0");
     SHFILEOPSTRUCT LpFileOp;
       LpFileOp.hwnd=GetSafeHwnd();//显示状态信息窗口的句柄,一般设为主窗体的句柄
       LpFileOp.wFunc=FO_COPY;//要执行的操作
       LpFileOp.pFrom=FromFileName;//源文件或目录
       LpFileOp.pTo=ToFileName;//目标文件或目录
    LpFileOp.fFlags=FOF_ALLOWUNDO|FOF_SIMPLEPROGRESS;//控制文件操作的标志
       LpFileOp.fAnyOperationsAborted=FALSE;//操作是否放弃。如果在完成之前取消任何文件操作,则返回TRUE
       LpFileOp.hNameMappings=NULL;//文件名映射对象的句柄,很少用
       LpFileOp.lpszProgressTitle = "正在下载";//进度条标题,仅在fFlags标志中指定了FOF_SIMPLEPROGRESS时有效
       int rval=SHFileOperation(&LpFileOp);//SHFileOperation文件复制移动更名删除的操作
       if(rval==0)                         //成功返回0
       {     if(LpFileOp.fAnyOperationsAborted==TRUE)
              {     CString s;
                     s.Format("文件'%s'下载被取消!",from);
                     AfxMessageBox(s,MB_OK);
                     return false;    }
              else
              {     return true;     }     }
       else
       {     CString s;
              s.Format("文件'%s'下载失败!",from);
              AfxMessageBox(s,MB_OK);
              return false;    }    
}

※也可以用SHFILEOPSTRUCT通过IP从异地服务器下载资源:
1, 用WNetAddConnection讲服务器驱动器影射到本地。
2, 用SHFILEOPSTRUCT实现复制功能即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值