兼容perl正则语法的文件复制工具repy.exe

Cplusplus
happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

兼容perl正则语法的文件复制工具repy.exe

帖子 #1 happy886rr » 2017年02月25日 20:32

REPY.EXE [VERSION 1.1]
下载:
repy源码1.1.7z
(26.32 KiB) 下载 6 次
repy源码1.1.7z
(26.32 KiB) 下载 6 次

1.png
1.png (28.85 KiB) 查看 873 次
1.png
1.png (28.85 KiB) 查看 873 次

摘要:
=============================================================================
兼容PERL正则语法的文件复制工具。支持指定目录,子目录搜寻,对匹配到的文件亦可
进行正则更名复制。同时支持高亮彩显。

支持 IGNORECASE, SINGLELINE, MULTILINE 等常见匹配模式。支持命名分组, 条件表
达式,递归表达式等多种高级特性。本工具引用了DEELX正则库版权归DEELX作者所有,
其余代码版权归本人所有。

DEELX正则库deelx.h下载地址 http://www.regexlab.com/deelx/
=============================================================================

语法:
Code: [全选] [展开/收缩] [Download] (Untitled.html)
  1. DEELX 正则表达式中标准的字符集合有:
  2.  
  3. 字符集合
  4.  
  5. 说明
  6.  
  7. .
  8.  
  9. 小数点可以匹配除了换行符(\n)以外的任意一个字符
  10.  
  11. \w
  12.  
  13. 可以匹配任何一个字母或者数字或者下划线
  14.  
  15. \W
  16.  
  17. W大写,可以匹配任何一个字母或者数字或者下划线以外的字符
  18.  
  19. \s
  20.  
  21. 可以匹配空格、制表符、换页符等空白字符的其中任意一个
  22.  
  23. \S
  24.  
  25. S大写,可以匹配任何一个空白字符以外的字符
  26.  
  27. \d
  28.  
  29. 可以匹配任何一个 0~9 数字字符
  30.  
  31. \D
  32.  
  33. D大写,可以匹配任何一个非数字字符
  34.  
  35. [:alpha:]
  36.  
  37. POSIX 格式,可以匹配任何一个字母
  38.  
  39. [:^alpha:]
  40.  
  41. POSIX 否定格式,可以匹配任何一个字母以外的字符
  42.  
  43. 如果正则表达式匹配模式为 SINGLELINE,小数点可以匹配包含换行符在内的任一字符。更多详情,参见正则表达式匹配模式。
  44.  
  45. DEELX 支持的 POSIX 字符集合定义有:
  46.  
  47. POSIX 字符集合
  48.  
  49. 说明
  50.  
  51. [:alnum:]
  52.  
  53. 任何一个字母或数字(A - Z, a - z, 0 - 9)
  54.  
  55. [:alpha:]
  56.  
  57. 任何一个字母(A - Z, a - z)
  58.  
  59. [:ascii:]
  60.  
  61. 任何一个 ASCII 范围内字符(\x00 – \x7F)
  62.  
  63. [:cntrl:]
  64.  
  65. 任何一个控制字符(\x00 – \x1F, \x7F)
  66.  
  67. [:digit:]
  68.  
  69. 任何一个数字(0 – 9)
  70.  
  71. [:print:]
  72.  
  73. 任何一个可显示的 ASCII 字符(\x20 – \x7E)
  74.  
  75. [:space:]
  76.  
  77. 任何一个空白字符(\x09 – \x0D, \x20)
  78.  
  79. [:graph:]
  80.  
  81. 任何一个可显示的 ASCII 字符,不包含空格(\x21 – \x7E)
  82.  
  83. [:lower:]
  84.  
  85. 任何一个小写字母(a – z)
  86.  
  87. [:punct:]
  88.  
  89. 可显示字符 [:print:] 中除去字母数字 [:alnum:]
  90.  
  91. [:upper:]
  92.  
  93. 任何一个大写字母(A – Z)
  94.  
  95. [:xdigit:]
  96.  
  97. 任何一个十六进制数字(0 - 9, A - F, a - f)
  98.  
  99. [:blank:]
  100.  
  101. 空格或者制表符(\x20, \x09)

用法:
-----------------------------------------------------------------------------
repy [match expression] [format expression]
-----------------------------------------------------------------------------
/r Recursive subdirectories REM 递归子目录
/f Force copy REM 强制复制文件
-----------------------------------------------------------------------------

示例:
-----------------------------------------------------------------------------
REM 递归子目录复制到H盘test目录下
repy /r (.*\.tlog) h:\test\$1

REM 将制定目录文件复制到制定目录,请转义斜杠
repy /f E:\\li\\desk\\新建文件夹\\src\\Release\\1.txt H:\1.txt

-----------------------------------------------------------------------------

英译:
-----------------------------------------------------------------------------
REGULAR COPY TOOLS, COPYRIGHT@2017~2019 BY HAPPY
-----------------------------------------------------------------------------
repy [match expression] [format expression]
-----------------------------------------------------------------------------
/help Show help information
/r Recursive subdirectories
/f Force copy
-----------------------------------------------------------------------------
2017-02-25


Code: [全选] [展开/收缩] [Download] (Untitled.c)
  1. /*
  2.     REGULAR COPY TOOLS, COPYRIGHT@2016~2018 BY HAPPY, VERSION 1.1
  3.     REPY.EXE
  4. */
  5.  
  6. #include   "deelx.h"
  7. #include <windows.h>
  8. #include  <direct.h>
  9. #include   <stdio.h>
  10. #include  <assert.h>
  11. #include  <stdlib.h>
  12. #include  <string.h>
  13. #include      <io.h>
  14.  
  15. /***************定义全局变量*************/
  16. //百分比标记
  17. char perMARKS[51];
  18. //进度条容器
  19. const char proGRESS[128]="[                                                      ]\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";
  20. //定义路径名最大长度(字节)
  21. #define  PATH_SIZE   512
  22. //定义文件名最大长度(字节)
  23. #define  FNAME_SIZE 1024
  24. //主窗口句柄
  25. HANDLE handle_out;
  26.  
  27. //定义帮助说明
  28. #define HELP_INFORMATION "\
  29. -----------------------------------------------------------------\n\
  30. REGULAR COPY TOOLS, COPYRIGHT@2017~2019 BY HAPPY, VERSION 1.1\n\
  31. -----------------------------------------------------------------\n\
  32. repy [match expression] [format expression]\n\
  33. -----------------------------------------------------------------\n\
  34.      /h  Show help information\n\
  35.      /r  Recursive subdirectories\n\
  36.      /f  Force copy\n\
  37. -----------------------------------------------------------------\n\
  38. 2017-02-25"
  39.  
  40. /***************功能函数群***************/
  41. char* strrstr(const char *dst, const char *src)  
  42. {  
  43.     assert(dst);assert(src);  
  44.     const char *pdst=dst, *psrc=src;
  45.     char *ret=NULL;  
  46.     while(*dst){
  47.         while(*pdst==*psrc){
  48.  
  49.             if(*pdst=='\0'){
  50.                 return ret=(char*)dst;
  51.             }else{  
  52.                 pdst++;  
  53.                 psrc++;  
  54.             }  
  55.         }  
  56.         if(*psrc=='\0'){ret=(char*)dst;}
  57.         pdst=++dst;  
  58.         psrc=src;  
  59.     }  
  60.     return ret;  
  61. }
  62. //进度条回调函数
  63. DWORD CALLBACK CopyProgressRunTim(
  64.  
  65.     LARGE_INTEGER tFileSize,
  66.     LARGE_INTEGER tTransferred,
  67.     LARGE_INTEGER StreamSize,
  68.     LARGE_INTEGER Streamferred,
  69.     DWORD  StreamNumber,
  70.     DWORD  CallbackReason,
  71.     HANDLE SourceFile,
  72.     HANDLE DestinationFile,
  73.     LPVOID lpData
  74. )
  75. {
  76.     //计算进度
  77.     int i=(tFileSize.LowPart<=0) ?100 :(tTransferred.LowPart*1.0)/(tFileSize.LowPart)*100, j=i>>1;
  78.  
  79.     //显示递增进度
  80.     while((j--)>perMARKS[0] && !(perMARKS[j])){perMARKS[j]=TRUE; fputc('=', stdout);}
  81.     perMARKS[0]=i>>1;
  82.  
  83.     //显示进度百分比
  84.     fprintf(stdout, "%02d%%\b\b\b", i);
  85.  
  86.     //回调
  87.     return PROGRESS_CONTINUE;
  88. }
  89. //正则命名函数
  90. void ReCopy(
  91.     int FLAG,             //复制模式开关
  92.     const char* Org_Path, //工作目录
  93.     char* RE_Match,       //要匹配的正则
  94.     char* RE_Format       //要更名的正则
  95. )
  96. {
  97.     //设置工作目录
  98.     _chdir(Org_Path);
  99.    
  100.     struct _finddata_t FileS;  
  101.     intptr_t handle=_findfirst("*",&FileS);
  102.     bool M=(handle==-1)?TRUE:FALSE;
  103.    
  104.     while(!M){
  105.         if(
  106.             (strcmp(FileS.name, ".")==0) ||
  107.             (strcmp(FileS.name,"..")==0)
  108.         ){
  109.             M=(_findnext(handle, &FileS)!=0)?TRUE:FALSE;
  110.             continue;
  111.         }
  112.  
  113.         //匹配正则
  114.         CRegexpT<char> regexp(RE_Match);
  115.         MatchResult result=regexp.Match(FileS.name);
  116.  
  117.         //执行复制
  118.         if(result.IsMatched()){
  119.                 //正则替换
  120.             char* tpSTR=regexp.Replace(FileS.name, RE_Format);
  121.  
  122.             //绘进度条
  123.             SetConsoleTextAttribute(handle_out, 1|4|8);  //紫色
  124.             fprintf(stdout, "Copy... ");
  125.             SetConsoleTextAttribute(handle_out, 2|8);    //绿色
  126.             fprintf(stdout, "%s -> %s\n", FileS.name, tpSTR);
  127.             SetConsoleTextAttribute(handle_out, 2|4|8);  //黄色
  128.             fputs(proGRESS, stdout);
  129.  
  130.             //初始化进度数组
  131.             memset(perMARKS, FALSE, 50);
  132.  
  133.             //强制删除
  134.             if(FLAG==0x01){remove(tpSTR);}
  135.  
  136.             //复制文件
  137.             if(!CopyFileEx(FileS.name, tpSTR, (LPPROGRESS_ROUTINE)CopyProgressRunTim, NULL, FALSE, COPY_FILE_FAIL_IF_EXISTS)){
  138.                 SetConsoleTextAttribute(handle_out, 4|8);
  139.                 fprintf(stdout, "Failed to copy, Check if the target path exists");
  140.             }
  141.             SetConsoleTextAttribute(handle_out, 1|2|4|8);//白色
  142.             fputs("\n\n", stdout);
  143.             //释放字串
  144.             CRegexpT<char>::ReleaseString(tpSTR);
  145.         }
  146.  
  147.         M=(_findnext(handle, &FileS)!=0)?TRUE:FALSE;
  148.     }
  149.     _findclose(handle);
  150.    
  151.     //递归子目
  152.     if(FLAG==0x02){
  153.         handle=_findfirst("*.*", &FileS);
  154.         M=(handle==-1)?true:false;
  155.         while(!M){
  156.             if(FileS.attrib & _A_SUBDIR){
  157.                 if(
  158.                     (strcmp(FileS.name, ".")!=0) &&
  159.                     (strcmp(FileS.name,"..")!=0)
  160.                 ){
  161.                     //正则复制
  162.                     ReCopy(FLAG, FileS.name, RE_Match, RE_Format);
  163.                 }
  164.             }
  165.             M=(_findnext(handle, &FileS)!=0);
  166.         }
  167.         _findclose(handle);
  168.     }
  169.  
  170.     //还原目录、释放内存
  171.     _chdir(Org_Path);
  172. }
  173.  
  174. /*************MAIN主函数入口*************/
  175. int main(int argc, char ** argv)
  176. {
  177.     //检查输入参数是否存在错误
  178.     if(
  179.         (argc!=3 && argc!=4        )   ||
  180.         (argc==3 && argv[1][0]=='/')   ||
  181.         (argc==4 && argv[1][0]!='/')   ||
  182.         (
  183.             argc>1          &&
  184.             argv[1][0]=='/' &&
  185.             (
  186.                 argv[1][1]=='?'||
  187.                 argv[1][1]=='h'||
  188.                 argv[1][1]=='H'
  189.             )
  190.         )
  191.     ){
  192.         fputs(HELP_INFORMATION, stdout);
  193.         exit(0);
  194.     }
  195.  
  196.     //模式变量
  197.     int i=1, FLAG=0x00;
  198.  
  199.     //解析开关
  200.     if(argv[i][0]=='/' && argc==4){
  201.  
  202.         switch(argv[i][1])
  203.         {
  204.         case 'f':
  205.         case 'F':
  206.             FLAG=0x01, i++;
  207.             break;
  208.         case 'r':
  209.         case 'R':
  210.             FLAG=0x02, i++;
  211.             break;
  212.         default:
  213.             //无法识别的开关
  214.             fprintf(stderr, "Unrecognized switch '%s'\n", argv[i]);
  215.             exit(1);
  216.         }
  217.     }
  218.  
  219.     handle_out=GetStdHandle(STD_OUTPUT_HANDLE);
  220.  
  221.     char* Org_Path=(char*)calloc(PATH_SIZE, sizeof(char));
  222.     char* p=strrstr(argv[i], "\\\\");
  223.     if(p!=NULL){
  224.         strncpy_s(Org_Path, PATH_SIZE, (const char*)argv[i], (int)p-(int)argv[i]);
  225.         ReCopy(FLAG,  Org_Path, p+2, argv[i+1]);
  226.     }else{
  227.         ReCopy(FLAG,   ".", argv[i], argv[i+1]);
  228.     }
  229.  
  230.     return 0;
  231. }

回到 “C/C++”

在线用户

用户浏览此论坛: Bing [Bot] 和 1 访客