Board logo

标题: [文件操作] [第三方]复制文件并显示系统进度条,支持不同源目录 [打印本页]

作者: 523066680    时间: 2015-11-26 22:52     标题: [第三方]复制文件并显示系统进度条,支持不同源目录

http://bcn.bathome.net/s/tool/index.html?key=copyw

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

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

动机:有段时间帮别人复制电影,对方从N个不同目录选取,然后复制
          不爽的地方就是频繁的复制粘贴,目录切换,如果不同时操作(卡卡卡),还要等待某部分复制完再继续
以及,我也写过一个Perl读取剪切板列表,直到遇到文件夹才开始复制的,进度条都是用字符串的……  那感觉好累=_=
  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.     Support: Copy from different folder, Unicode String
  15. */
  16. #include <cstdio>
  17. #include <cstdlib>
  18. #include <io.h>
  19. #include <windows.h>
  20. void ShellCopy( wchar_t *SRC, wchar_t *DST );
  21. void connect_wcs_array (
  22.         wchar_t *buff,
  23.         wchar_t *array[],
  24.         int      begin,
  25.         int      end      
  26.     );
  27. int wmain(int argc, wchar_t *argv[] )
  28. {
  29.     if (argc < 3)
  30.     {
  31.         printf("Arguments not enough\n");
  32.         return -1;
  33.     }
  34.     //argv[argc-1] - Destination
  35.     int length = 0;
  36.     for (int i = 1; i <= argc-2; i++)
  37.     {
  38.         length += wcslen( argv[i] ) + 1;
  39.     }
  40.     length++; // 0x00 0x00
  41.     wchar_t *fwaits = (wchar_t *) malloc(
  42.                         length * sizeof(wchar_t) );
  43.     connect_wcs_array( fwaits, argv, 1, argc-2 );
  44.     ShellCopy( fwaits, argv[argc-1] );
  45.     free(fwaits);
  46.     return 0;
  47. }
  48. void ShellCopy( wchar_t *SRC, wchar_t *DST )
  49. {
  50.     int sherr;
  51.     SHFILEOPSTRUCTW op;
  52.     ZeroMemory( &op, sizeof(op) );
  53.     op.hwnd  = NULL;
  54.     op.wFunc = FO_COPY;
  55.     op.pFrom = SRC;
  56.     op.pTo   = DST;
  57.     op.fFlags= 0;
  58.     sherr    = SHFileOperationW( &op );
  59.     printf("%x", sherr);
  60. }
  61. void connect_wcs_array (
  62.         wchar_t *buff,
  63.         wchar_t *array[],
  64.         int      begin,
  65.         int      end
  66.     )
  67. {
  68.     int i;
  69.     wchar_t *pt = buff;
  70.     for ( i = begin; i <= end; i++ )
  71.     {
  72.         wcsncpy( pt, array[i], wcslen(array[i]) + 1 );
  73.         pt += wcslen(array[i]) + 1;
  74.     }
  75.     *(pt) = L'\0';   // append 0x00
  76. }
复制代码

作者: 523066680    时间: 2015-11-26 23:03

好像忘了free
作者: aa77dd@163.com    时间: 2015-11-26 23:04

经验里, WIN 系统总只能在同一目录内多选 再 复制到某地方, 因为硬盘的物理实现, 复制这种东东MS 也只能先拟个表单, 再逐个处理, 虽是批量处理了, 但并不能并行, 只是预列表单是, 有一种并行的感觉
作者: 523066680    时间: 2015-11-26 23:07

回复 3# aa77dd@163.com


    还看硬盘的瓶颈,要是固态和高配置的传输路线,那自然是666 也不用考虑太多
作者: CrLf    时间: 2015-11-27 03:53

噗哈哈哈哈哈哈简直受不了,那谁又提 C艹 了
已更新到 Batch-CN,话说楼主就不能写个帮助信息
作者: 523066680    时间: 2015-11-27 10:04

回复 5# CrLf




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2