带进度条复制文件(调用ShellAPI)

Cplusplus
头像
523066680
Administrator
Administrator
帖子: 347
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 31 times
Been thanked: 31 times
联系:

带进度条复制文件(调用ShellAPI)

帖子 #1 523066680 » 2016年10月06日 11:35

编译方法:
MinGW: g++ main.cpp -municode
MSVC : cl main.cpp /link shell32.lib

使用方法参见代码开头注释部分,支持从不同的目录复制文件到指定目录,支持Unicode字符
(在终端粘贴Unicode字符虽然看到是空白的,但是并没有丢失)

动机:有段时间帮别人复制电影,移动硬盘里分了多个子目录,从每个目录中挑选并分别复制到目标目录。
在 windows下不能对不同目录下的文件 ctrl+c 然后再一次性粘贴到某个目录。所以写了这个工具,可以在调用时把多个文件
(可以是不同目录下的)拖到参数里,最后把目标目录拖到最后一个参数,按Enter后开始复制。

图例:
Snap3.png
Snap3.png (11.31 KiB) 查看 429 次
Snap3.png
Snap3.png (11.31 KiB) 查看 429 次


Code: [全选] [展开/收缩] [Download] (CopywithProcessBar.cpp)
  1. /*
  2.     Code by: 523066680
  3.     Date   : 2015-11
  4.     Compile:
  5.         MinGW: g++ main.cpp -municode
  6.         MSVC : cl  main.cpp /link shell32.lib
  7.     Usage:
  8.         Example:
  9.             main.exe D:\FA\* F:\Spare
  10.             main.exe D:\FA\* D:\FB\name.iso F:\Spare
  11.             main.exe "D:\FA\Pro・e.rar" "F:\Spare"
  12.         Note:
  13.             Last path is the destination
  14.  
  15.     Support: Copy from different folder, Unicode String
  16. */
  17.  
  18. #include <cstdio>
  19. #include <cstdlib>
  20. #include <io.h>
  21. #include <windows.h>
  22.  
  23.  
  24. void ShellCopy( wchar_t *SRC, wchar_t *DST );
  25.  
  26. void connect_wcs_array (
  27.         wchar_t *buff,
  28.         wchar_t *array[],
  29.         int      begin,
  30.         int      end      
  31.     );
  32.  
  33. int wmain(int argc, wchar_t *argv[] )
  34. {
  35.     if (argc < 3)
  36.     {
  37.         printf("Arguments not enough\n");
  38.         return -1;
  39.     }
  40.  
  41.     //argv[argc-1] - Destination
  42.  
  43.     int length = 0;
  44.     for (int i = 1; i <= argc-2; i++)
  45.     {
  46.         length += wcslen( argv[i] ) + 1;
  47.     }
  48.     length++; // 0x00 0x00
  49.  
  50.     wchar_t *fwaits = (wchar_t *) malloc(
  51.                         length * sizeof(wchar_t) );
  52.  
  53.     connect_wcs_array( fwaits, argv, 1, argc-2 );
  54.     ShellCopy( fwaits, argv[argc-1] );
  55.     free(fwaits);
  56.     return 0;
  57. }
  58.  
  59. void ShellCopy( wchar_t *SRC, wchar_t *DST )
  60. {
  61.     int sherr;
  62.     SHFILEOPSTRUCTW op;
  63.     ZeroMemory( &op, sizeof(op) );
  64.     op.hwnd  = NULL;
  65.     op.wFunc = FO_COPY;
  66.     op.pFrom = SRC;
  67.     op.pTo   = DST;
  68.     op.fFlags= 0;
  69.     sherr    = SHFileOperationW( &op );
  70.     printf("%x", sherr);
  71. }
  72.  
  73. void connect_wcs_array (
  74.         wchar_t *buff,
  75.         wchar_t *array[],
  76.         int      begin,
  77.         int      end
  78.     )
  79. {
  80.     int i;
  81.     wchar_t *pt = buff;
  82.  
  83.     for ( i = begin; i <= end; i++ )
  84.     {
  85.         wcsncpy( pt, array[i], wcslen(array[i]) + 1 );
  86.         pt += wcslen(array[i]) + 1;
  87.     }
  88.     *(pt) = L'\0';   // append 0x00
  89. }


copyw.rar
(32.76 KiB) 下载 10 次
copyw.rar
(32.76 KiB) 下载 10 次


参考:在拷贝、删除文件时显示飞行的文件夹动画

头像
523066680
Administrator
Administrator
帖子: 347
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 31 times
Been thanked: 31 times
联系:

Re: 带进度条复制文件(调用ShellAPI)

帖子 #2 523066680 » 2016年10月06日 11:50

Code: [全选] [展开/收缩] [Download] (Untitled.txt)
  1. > windows.h > _mingw.h > _cygwin.h > stddef.h > crtdefs.h
  2.                         > _mingw_mac.h
  3.                         > _mingw_secapi.h
  4.                         > sdks/_mingw_ddk.h
  5.                         > sdks/_mingw_directx.h
  6.                         > vadefs.h
  7.              > cderr.h
  8.              > commdlg.h
  9.              > dde.h
  10.              > ddeml.h
  11.              > excpt.h
  12.              > imm.h
  13.              > lzexpand.h
  14.              > mcx.h
  15.              > mmsystem.h
  16.              > nb30.h
  17.              > ole.h
  18.              > rpc.h > rpcasync.h
  19.                      > rpcdce.h > rpcdcep.h
  20.                      > rpcnsi.h
  21.                      > rpcnterr.h
  22.              > sdkddkver.h
  23.              > shellapi.h
  24.              > stdarg.h > _mingw_stdarg.h
  25.              > stralign.h > sec_api/stralign_s.h
  26.              > virtdisk.h
  27.              > winbase.h > apisetcconv.h
  28.                          > bemapiset.h
  29.                          > debugapi.h
  30.                          > errhandlingapi.h
  31.                          > fibersapi.h
  32.                          > fileapi.h
  33.                          > handleapi.h
  34.                          > heapapi.h
  35.                          > interlockedapi.h
  36.                          > ioapiset.h
  37.                          > jobapi.h
  38.                          > libloaderapi.h
  39.                          > memoryapi.h
  40.                          > minwinbase.h
  41.                          > namedpipeapi.h
  42.                          > namespaceapi.h
  43.                          > processenv.h
  44.                          > processthreadsapi.h
  45.                          > processtopologyapi.h
  46.                          > profileapi.h
  47.                          > realtimeapiset.h
  48.                          > securityappcontainer.h
  49.                          > securitybaseapi.h
  50.                          > synchapi.h
  51.                          > sysinfoapi.h
  52.                          > systemtopologyapi.h
  53.                          > threadpoolapiset.h
  54.                          > threadpoollegacyapiset.h
  55.                          > timezoneapi.h
  56.                          > utilapiset.h
  57.                          > winerror.h > fltwinerror.h
  58.                          > wow64apiset.h
  59.              > wincon.h
  60.              > wincrypt.h > bcrypt.h
  61.                           > ncrypt.h
  62.              > windef.h > minwindef.h > specstrings.h > sal.h
  63.                                       > winapifamily.h
  64.                                       > winnt.h > apiset.h
  65.                                                 > basetsd.h
  66.                                                 > ctype.h
  67.                                                 > guiddef.h > string.h
  68.                                                 > ktmtypes.h
  69.                                                 > poppack.h
  70.                                                 > psdk_inc/intrin-impl.h > intrin.h
  71.                                                 > pshpack2.h
  72.                                                 > pshpack4.h
  73.                                                 > pshpack8.h
  74.              > winefs.h
  75.              > wingdi.h > pshpack1.h
  76.              > winnetwk.h > wnnc.h
  77.              > winnls.h > datetimeapi.h
  78.                         > stringapiset.h
  79.              > winperf.h
  80.              > winreg.h > reason.h
  81.              > winresrc.h > commctrl.rh
  82.                           > dde.rh
  83.                           > dlgs.h
  84.                           > winnt.rh
  85.                           > winuser.rh
  86.                           > winver.h > _mingw_unicode.h
  87.              > winscard.h > SCardErr.h
  88.                           > winioctl.h
  89.                           > winsmcrd.h
  90.                           > wtypes.h > ole2.h > objbase.h > combaseapi.h
  91.                                                           > objidl.h
  92.                                                           > propidl.h
  93.                                                           > urlmon.h
  94.                                               > oleauto.h > oaidl.h
  95.                                               > oleidl.h
  96.                                      > rpcndr.h > rpcnsip.h
  97.                                                 > rpcsal.h
  98.                                      > wtypesbase.h
  99.              > winsock.h > _bsd_types.h
  100.                          > _timeval.h
  101.                          > inaddr.h
  102.                          > psdk_inc/_fd_types.h
  103.                          > psdk_inc/_ip_mreq1.h
  104.                          > psdk_inc/_ip_types.h
  105.                          > psdk_inc/_socket_types.h
  106.                          > psdk_inc/_wsa_errnos.h
  107.                          > psdk_inc/_wsadata.h
  108.                          > psdk_inc/_xmitfile.h
  109.              > winspool.h > prsht.h
  110.              > winsvc.h
  111.              > winuser.h > tvout.h


回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 3 访客