找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 22524|回复: 5

[文件操作] [第三方]复制文件并显示系统进度条,支持不同源目录

[复制链接]
发表于 2015-11-26 22:52:17 | 显示全部楼层 |阅读模式
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. }

复制代码

评分

参与人数 2技术 +2 收起 理由
依山居 + 1 1
aa77dd@163.com + 1 C还是C艹 管它呢

查看全部评分

 楼主| 发表于 2015-11-26 23:03:27 | 显示全部楼层
好像忘了free
发表于 2015-11-26 23:04:46 | 显示全部楼层
经验里, WIN 系统总只能在同一目录内多选 再 复制到某地方, 因为硬盘的物理实现, 复制这种东东MS 也只能先拟个表单, 再逐个处理, 虽是批量处理了, 但并不能并行, 只是预列表单是, 有一种并行的感觉
 楼主| 发表于 2015-11-26 23:07:16 | 显示全部楼层
回复 3# aa77dd@163.com


    还看硬盘的瓶颈,要是固态和高配置的传输路线,那自然是666 也不用考虑太多
发表于 2015-11-27 03:53:44 | 显示全部楼层
噗哈哈哈哈哈哈简直受不了,那谁又提 C艹 了
已更新到 Batch-CN,话说楼主就不能写个帮助信息
 楼主| 发表于 2015-11-27 10:04:17 | 显示全部楼层
回复 5# CrLf
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:47 , Processed in 0.020196 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表