Windows API 实现查找、删除任意类型的文件_VERSION20120605(vc6.0调试通过)(2012.6.5最新修改)...

   1 // FileToolsV20120605.cpp : Defines the entry point for the application.
   2 //
   3 //用vc6.0建立一个win32简单应用程序
   4 
   5 #include "stdafx.h"
   6 #include <stdio.h>
   7 #include <fcntl.h>
   8 #include <io.h>
   9 #include <iostream>
  10 #include <fstream>
  11 #include <conio.h>
  12 #include <SHELLAPI.H>
  13 
  14 //
  15 
  16 //调试开关:
  17 
  18 //#define FLAG_DEBUG
  19 
  20 
  21 
  22 //
  23 
  24 //要删除的目录
  25 
  26 #define FIND_FILE_PATH "C:\\Program Files"
  27 
  28 //要删除的文件类型
  29 
  30 #define FIND_FILE_TYPE ".exe"
  31 
  32 //
  33 
  34 
  35 
  36 #define FILE_NAME_TYPE "*.*"
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 //最大的文件查找字节数
  45 
  46 #define MAX_FIND_PATH 1000
  47 
  48 
  49 
  50 //函数返回值:
  51 
  52 #define RTN_OK (0)
  53 
  54 #define RTN_ERR (1)
  55 
  56 
  57 
  58 //休眠秒数
  59 
  60 #define SLEEP_SECOND 100
  61 
  62 
  63 
  64 //LOGO字符串
  65 
  66 #define STR_LOGO "\
  67 ┌---------------------------------------------------------------┐\n\
  68 │Files Toos [版本 FTV01R01C01]                                  │ \n\
  69 │ Build By BinG @2012.3, Email:zww0815@gmail.com.               │ \n\
  70 │ 版权所有 (c) 2012 Zkf39219。保留所有权利。                    │ \n\
  71 └---------------------------------------------------------------┘\n"
  72     
  73     
  74     
  75     //帮助信息字符串
  76     
  77 #define STR_HELP ""\
  78     " 查看帮助\n"\
  79     "m 修改配置信息\n"\
  80     "q 退出\n"\
  81     "d 打开调试开关\n"\
  82     "c 清屏\n"\
  83     "t 测试\n"\
  84     "-----------------------------------\n"\
  85     "自己输入:y,自己不想输入:<任意键>\n"
  86 
  87 //往屏幕打印信息    
  88 #define PRINTTOSCR(str) do\
  89 {\
  90 printf("%s",str);\
  91 } while (0);
  92 
  93 
  94 
  95 
  96 
  97 enum
  98 {
  99     FLAG_ZERO, //0 :默认0
 100     FLAG_VIEW_FILE,//1 :查看文件 
 101     FLAG_DELETE, //2 :删除文件 
 102     FLAG_INIT_OK, //3 :全局变量初始化标志
 103     FLAG_INIT_NO, //4 :全局变量没有初始化
 104     FLAG_ONE_LOG, //5 :打开程序只能有一个log标志
 105     FLAG_FILENAME_TIME, //6 :文件以时间命令。
 106     FLAG_FILENAME_ZHID, //7 :文件指定命名
 107 };
 108 
 109 
 110 
 111 
 112 
 113 
 114 
 115 //-----------------------------------------------------------
 116 
 117 // 函数声明
 118 
 119 //-----------------------------------------------------------
 120 
 121 #ifdef __cplusplus
 122 extern "C" {    
 123 #endif //__cplusplus
 124 
 125     void InitGlobalVar();
 126     void PrintLocalTime(void* flag);
 127     void fOpenFileFp(FILE** fp);
 128     void fCloseFileFp(FILE** fp);
 129     void VisitAllFiles(char * lpPath);
 130     void GetCurSysTime(char* str);
 131     void FileOptions();
 132     void CloseOrFreeGlobalVar();
 133     void DebugAndPrintAllGlobalVar();
 134     int FileOpt();
 135 
 136 #ifdef __cplusplus    
 137 }
 138 #endif //__cplusplus
 139 
 140 
 141 
 142 
 143 
 144 #ifndef _USE_OLD_IOSTREAMS
 145 
 146 using namespace std;
 147 
 148 #endif
 149 
 150 
 151 
 152 // maximum mumber of lines the output console should have
 153 
 154 static const WORD MAX_CONSOLE_LINES = 500;
 155 
 156 //-----------------------------------------------------------
 157 
 158 // 全局变量声明(定义) 
 159 
 160 //-----------------------------------------------------------
 161 
 162 //全局的文件计数与文件清理计数
 163 
 164 static long g_lCheckFileNumber;
 165 
 166 static long g_lCheckOkFileNumber;
 167 
 168 static long g_lClearFileNumber;
 169 
 170 static int g_flagDeleteFile;
 171 
 172 static int g_flagOnlyOneLog = FLAG_ONE_LOG;
 173 
 174 
 175 
 176 //
 177 
 178 //用于全局初始化函数中的是否初始化标志。
 179 
 180 //初始化时置1
 181 
 182 //调用CloseOrFreeGlobalVar函数时重新置0
 183 
 184 //默认值:FLAG_INIT_NO 0
 185 
 186 static int g_flagInitFuncIsFinish=FLAG_INIT_NO;
 187 
 188 /
 189 
 190 ///全局的指针变量
 191 
 192 
 193 
 194 /* 定义全局的FILE类型指针,供写日志 */
 195 
 196 FILE* g_fpLog;
 197 
 198 FILE* g_fpCheckOK;
 199 
 200 /
 201 
 202 //定义全局的查找文件路径及类型
 203 
 204 char g_strFindFilePath[MAX_FIND_PATH];
 205 
 206 char g_strFindFileType[10];
 207 
 208 
 209 
 210 //全局的时间字符串
 211 
 212 char g_pStrTime[50];
 213 
 214 
 215 
 216 //全局的文件路径名字符串
 217 
 218 char g_strTemFileName[80];
 219 
 220 
 221 
 222 //函数访问次数
 223 
 224 int g_iCount = 0;
 225 
 226 
 227 void RedirectIOToConsole()
 228 {
 229     
 230     int hConHandle;
 231     long lStdHandle;
 232     CONSOLE_SCREEN_BUFFER_INFO coninfo;
 233     FILE *fp;
 234     
 235     // 分配一个控制台程序
 236     AllocConsole();
 237 
 238     // 设置足够大的屏幕缓存可以让我们滑动文本
 239     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
 240 
 241     // 设置控制台屏幕的高度 
 242     coninfo.dwSize.Y = MAX_CONSOLE_LINES;
 243     
 244     // 设置控制台屏幕缓存大小 
 245     SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
 246     
 247     // 获取标准输出句柄
 248     lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
 249     
 250     //打开标准输出句柄,类似打开文件的方式如fopen,返回一个文件描述符
 251     hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
 252     
 253     // 以可写的方式打开 
 254     fp = _fdopen( hConHandle, "w" ); 
 255     *stdout = *fp;
 256     setvbuf( stdout, NULL, _IONBF, 0 );
 257     
 258     // redirect unbuffered STDIN to the console
 259     lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); 
 260     hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
 261     fp = _fdopen( hConHandle, "r" );
 262     *stdin = *fp; 
 263     setvbuf( stdin, NULL, _IONBF, 0 ); 
 264     
 265     // redirect unbuffered STDERR to the console
 266     lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
 267     hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
 268     fp = _fdopen( hConHandle, "w" ); 
 269     *stderr = *fp; 
 270     setvbuf( stderr, NULL, _IONBF, 0 ); 
 271     
 272     // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
 273     // point to console as well
 274     ios::sync_with_stdio();
 275 } 
 276 
 277 
 278 
 279 void test()
 280 {
 281     int iVar;
 282     RedirectIOToConsole(); 
 283     
 284     // test stdio
 285     fprintf(stdout, "Test output to stdout\n"); 
 286     fprintf(stderr, "Test output to stderr\n");
 287     fprintf(stdout, "Enter an integer to test stdin: "); 
 288     scanf("%d", &iVar); 
 289     printf("You entered %d\n", iVar);
 290     
 291     //test iostreams
 292     cout << "Test output to cout" << endl;
 293     cerr << "Test output to cerr" << endl;
 294     clog << "Test output to clog" << endl;
 295     cout << "Enter an integer to test cin: ";
 296     cin >> iVar;
 297     cout << "You entered " << iVar << endl;
 298 } 
 299 
 300 
 301 
 302 
 303 
 304 int APIENTRY WinMain(HINSTANCE hInstance,
 305                      
 306                      HINSTANCE hPrevInstance,
 307                      
 308                      LPSTR lpCmdLine,
 309                      
 310                      int nCmdShow)
 311                      
 312 {
 313     
 314     // TODO: Place code here.
 315     
 316     
 317     
 318     //test();
 319     
 320     RedirectIOToConsole();
 321     
 322     (void)FileOpt();
 323     
 324     return 0;
 325     
 326 }
 327 
 328 
 329 
 330 
 331 
 332 
 333 
 334 //-----------------------------------------------------------
 335 
 336 // main函数 
 337 
 338 //-----------------------------------------------------------
 339 
 340 #if 1
 341 
 342 int FileOpt()
 343 
 344 {
 345     
 346 #if 1
 347     
 348     InitGlobalVar();
 349     
 350     FileOptions();
 351     
 352     
 353     
 354 #ifdef FLAG_DEBUG
 355     
 356     DebugAndPrintAllGlobalVar();
 357     
 358 #endif
 359     
 360     CloseOrFreeGlobalVar();
 361     
 362     
 363     
 364 #endif
 365     
 366     return 0;
 367     
 368 }
 369 
 370 #endif // 0
 371 
 372 
 373 
 374 
 375 
 376 
 377 
 378 //-----------------------------------------------------------
 379 
 380 // 函数实现 
 381 
 382 //-----------------------------------------------------------
 383 
 384 
 385 
 386 /************************************************************************/
 387 
 388 /*说明: 同时打印输出到文件及屏幕上 */
 389 
 390 /* stream: 文件句柄,即文件描述符 */
 391 
 392 /* format: 格式字符串 */
 393 
 394 /* Build by zkf39219@2012.3 */
 395 
 396 /************************************************************************/
 397 
 398 void WriteFormatted (FILE * stream, char * format, ...)
 399 
 400 {
 401     
 402     /*BEGIN: Modify by zkf39219 @ 2012.511 for pointer NULL error */
 403     
 404     if (NULL == stream)
 405         
 406     {
 407         
 408         printf("FILE pointer init error:IS NULL!!!\n");
 409         
 410         return;
 411         
 412     }
 413     
 414     /*END: Modify by zkf39219 @ 2012.5.11 for pointer NULL error */
 415     
 416     
 417     
 418     //获取时间信息
 419     
 420     GetCurSysTime(g_pStrTime);
 421     
 422     
 423     
 424     va_list args;
 425     
 426     va_start (args, format);
 427     
 428     vfprintf (stream, format, args);
 429     
 430     vprintf (format, args);
 431     
 432     va_end (args);
 433     
 434 }
 435 
 436 
 437 
 438 
 439 /////
 440 
 441 //功能:
 442 
 443 //1.打开文件句柄
 444 
 445 //2.标志不同输出文件不同:
 446 
 447 //3.标志flag为FLAG_FILENAME_TIME:1时:文件名用时间命名
 448 
 449 //4.标志flag为FLAG_FILENAME_ZHID:2时:指定命名
 450 
 451 void fOpenFileFp(FILE** fp,
 452                  
 453                  int flag)//标志,1:文件名用时间命名,2:指定命名
 454                  
 455 {
 456     
 457     if (NULL == *fp)
 458         
 459     {
 460         
 461         *fp = (FILE*)malloc(sizeof(FILE));
 462         
 463         
 464         
 465         if (NULL == *fp)
 466             
 467         {
 468             
 469             printf("malloc error!!!\n");
 470             
 471             return;
 472             
 473         }
 474         
 475     }
 476     
 477     
 478     
 479     if (FLAG_ONE_LOG == g_flagOnlyOneLog)
 480         
 481     {
 482         
 483         char strTemFileName[80];
 484         
 485         GetCurSysTime(strTemFileName);
 486         
 487         strcat(strTemFileName,".log");
 488         
 489         strcpy(g_strTemFileName,strTemFileName);
 490         
 491     }
 492     
 493     
 494     
 495     
 496     
 497     if (FLAG_FILENAME_TIME == flag && (*fp = fopen(g_strTemFileName, "a")) == NULL)
 498         
 499     {
 500         
 501         WriteFormatted(g_fpLog,"Can't open %s \n", g_strTemFileName);
 502         
 503         exit(-1);
 504         
 505     }
 506     
 507     else if(FLAG_FILENAME_ZHID == flag && (*fp = fopen("OutPut.txt", "a")) == NULL)
 508         
 509     {
 510         
 511         WriteFormatted(g_fpLog,"Can't open %s \n", g_strTemFileName);
 512         
 513         exit(-1);
 514         
 515     }
 516     
 517     
 518     
 519     g_flagOnlyOneLog++;
 520     
 521 }
 522 
 523 
 524 
 525 //调试时打印所有全局变量
 526 
 527 void DebugAndPrintAllGlobalVar()
 528 
 529 {
 530     
 531     WriteFormatted(g_fpLog,
 532     "g_lCheckFileNumber :Ox%08x\n\
 533 g_lCheckOkFileNumber :Ox%08x\n\
 534 g_lClearFileNumber :Ox%08x\n\
 535 g_flagDeleteFile :Ox%08x\n\
 536 g_fpLog :Ox%08x\n\
 537 g_fpCheckOK :Ox%08x\n\
 538 g_pStrTime :Ox%08x\n\
 539 g_strFindFilePath :Ox%08x\n\
 540 g_strFindFileType :Ox%08x\n\
 541 g_iCount :Ox%08x\n\
 542 g_flagInitFuncIsFinish:Ox%08x\n--->%s\n",
 543 g_lCheckFileNumber,
 544 g_lCheckOkFileNumber,
 545 g_lClearFileNumber,
 546 g_flagDeleteFile,
 547 g_fpLog,g_fpCheckOK,g_pStrTime,g_strFindFilePath,
 548 g_strFindFileType,
 549 g_iCount,
 550 g_flagInitFuncIsFinish,
 551 (g_flagInitFuncIsFinish==FLAG_INIT_NO)?"内存已释放":"危险:内存没有释放");
 552     
 553     
 554     
 555     //释放指针g_fpLog的前提是标志g_flagInitFuncIsFinish置FLAG_INIT_NO
 556     
 557     //即其它内存已经释放
 558     
 559     if (FLAG_INIT_NO == g_flagInitFuncIsFinish)
 560         
 561     {
 562         
 563         fCloseFileFp(&g_fpLog);
 564         
 565         printf("g_fpLog :Ox%08x\n",g_fpLog);
 566         
 567     }
 568     
 569 }
 570 
 571 
 572 
 573 //
 574 
 575 //功能:
 576 
 577 // 初始化全局变量
 578 
 579 // 为了避免重复初始化,该函数初始化完成后置标志为FLAG_INIT_OK
 580 
 581 void InitGlobalVar()
 582 
 583 {
 584     
 585     //先判断是否已经初始化,已初始化直接返回
 586     
 587     if (FLAG_INIT_OK == g_flagInitFuncIsFinish)
 588         
 589     {
 590         
 591         return;
 592         
 593     }
 594     
 595     
 596     
 597     g_lCheckFileNumber = 0;
 598     
 599     g_lCheckOkFileNumber = 0;
 600     
 601     g_lClearFileNumber = 0;
 602     
 603     g_flagDeleteFile = FLAG_VIEW_FILE;
 604     
 605     
 606     
 607     g_fpLog = NULL;
 608     
 609     g_fpCheckOK = NULL;
 610     
 611     
 612     
 613     /* 初始化全局变量 g_fpLog */
 614     
 615     if (NULL == g_fpLog)
 616         
 617     {
 618         
 619         fOpenFileFp(&g_fpLog,FLAG_FILENAME_TIME);
 620         
 621     }
 622     
 623     
 624     
 625     /* 初始化全局变量 fp */
 626     
 627     if (NULL == g_fpCheckOK)
 628         
 629     {
 630         
 631         fOpenFileFp(&g_fpCheckOK,FLAG_FILENAME_ZHID);
 632         
 633     }
 634     
 635     
 636     
 637     /* 初始化全局变量 */
 638     
 639     GetCurSysTime( g_pStrTime );
 640     
 641     
 642     
 643     //strcpy(g_strFindFilePath,FIND_FILE_PATH);
 644     
 645     //strcpy(g_strFindFileType,FIND_FILE_TYPE);
 646     
 647     
 648     
 649     g_iCount = 0;
 650     
 651     g_flagInitFuncIsFinish = FLAG_INIT_OK;
 652     
 653 }
 654 
 655 void FreePTime(PSYSTEMTIME pTime)
 656 
 657 {
 658     
 659     /* 一定要进行下面判断,否则会造成重复释放NULL地址而崩溃 */
 660     
 661     if (NULL != pTime)
 662         
 663     {
 664         
 665         free(pTime);
 666         
 667         pTime = NULL;
 668         
 669     }
 670     
 671 }
 672 
 673 
 674 
 675 
 676 
 677 
 678 
 679 //打开文件句柄
 680 
 681 void fCloseFileFp(FILE** fp)
 682 
 683 {
 684     
 685     if (*fp)
 686         
 687     {
 688         
 689         fclose(*fp);
 690         
 691         *fp = NULL;
 692         
 693     }
 694     
 695 }
 696 
 697 
 698 
 699 ///
 700 
 701 //函数功能:
 702 
 703 //1.对全局的指针进行释放,并指向NULL
 704 
 705 //2.对全局变量置默认值
 706 
 707 //3.如果发现初始化标志没有OK,返回
 708 
 709 void CloseOrFreeGlobalVar()
 710 
 711 {
 712     
 713     if (FLAG_INIT_NO == g_flagInitFuncIsFinish )
 714         
 715     {
 716         
 717         return;
 718         
 719     }
 720     
 721     
 722     
 723     /* 调试时不在这释放日志内存指针g_fpLog,由调试函数释放 */
 724     
 725 #ifndef FLAG_DEBUG
 726     
 727     fCloseFileFp(&g_fpLog);
 728     
 729 #endif
 730     
 731     fCloseFileFp(&g_fpCheckOK);
 732     
 733     
 734     
 735     g_lCheckFileNumber = 0;
 736     
 737     g_lCheckOkFileNumber = 0;
 738     
 739     g_lClearFileNumber = 0;
 740     
 741     g_flagDeleteFile = FLAG_VIEW_FILE;
 742     
 743     
 744     
 745     //下面两行存在重大隐患:指针虽然指向NULL,但其内存空间没有释放,造成内存泄漏
 746     
 747     //fCloseFileFp函数里有指向NULL,所以这里不要再指向NULL.
 748     
 749     //g_fpLog = NULL;
 750     
 751     //g_fpCheckOK = NULL;
 752     
 753     
 754     
 755     g_flagInitFuncIsFinish = FLAG_INIT_NO;
 756     
 757     
 758     
 759 #ifdef FLAG_DEBUG
 760     
 761     //上面没有释放的句柄应该在这里面释放
 762     
 763     DebugAndPrintAllGlobalVar();
 764     
 765 #endif
 766     
 767 }
 768 
 769 
 770 
 771 ////
 772 
 773 /* Modify by zengwenwu @ 2012-3-19 :增加一标志,提供不同打印要求 */
 774 
 775 //1:打印长时间
 776 
 777 //0:短时间
 778 
 779 //-1:不打印,相当于只对pTime做赋值
 780 
 781 void GetCurSysTime(char* str)
 782 
 783 {
 784     
 785     LPSYSTEMTIME pstTemSysTime = NULL;
 786     
 787     
 788     
 789     pstTemSysTime = (LPSYSTEMTIME)malloc( sizeof(SYSTEMTIME) );
 790     
 791     
 792     
 793     if ( NULL == pstTemSysTime )
 794         
 795     {
 796         
 797         WriteFormatted(g_fpLog,"SYSTEMTIME malloc is err\n" );
 798         
 799         return;
 800         
 801     }
 802     
 803     
 804     
 805     memset(pstTemSysTime,0,sizeof(LPSYSTEMTIME));
 806     
 807     
 808     
 809     GetLocalTime( pstTemSysTime );
 810     
 811     
 812     
 813     sprintf((char*)str,"%04d-%02d-%02d %02d_%02d_%02d %03d",
 814         
 815         pstTemSysTime->wYear,
 816         
 817         pstTemSysTime->wMonth,
 818         
 819         pstTemSysTime->wDay,
 820         
 821         pstTemSysTime->wHour,
 822         
 823         pstTemSysTime->wMinute,
 824         
 825         pstTemSysTime->wSecond,
 826         
 827         pstTemSysTime->wMilliseconds
 828         
 829         );
 830     
 831 }
 832 
 833 
 834 /////
 835 
 836 //Function:
 837 
 838 // Visit all folders and files 
 839 
 840 //
 841 
 842 //Paremeter:
 843 
 844 // char *lpPath -- path of file
 845 
 846 //
 847 
 848 //Return:
 849 
 850 // void
 851 
 852 //
 853 
 854 
 855 
 856 void VisitAllFiles(char * lpPath)
 857 {    
 858     Sleep(SLEEP_SECOND);    
 859     char szFind[MAX_PATH];     
 860     WIN32_FIND_DATA FindFileData;    
 861     char chTemPath[MAX_FIND_PATH];
 862     
 863     strcpy(chTemPath,lpPath);    
 864     strcpy(szFind,lpPath);    
 865     strcat(szFind,"\\*.*");    
 866     
 867     /* 对全局时间g_pTime变量赋值 */    
 868     if (0 == g_iCount++)
 869     {        
 870         WriteFormatted(g_fpLog,"查找%s下%s类型的文件\n",g_strFindFilePath,g_strFindFileType);        
 871         WriteFormatted(g_fpLog,"BEGIN-------------------------------------------------%s\n",g_pStrTime);        
 872         WriteFormatted(g_fpCheckOK,"%s\n","\n\n");        
 873         WriteFormatted(g_fpCheckOK,"查找目录%s下%s类型的文件\n",g_strFindFilePath,g_strFindFileType);        
 874         WriteFormatted(g_fpCheckOK,"BEGIN-------------------------------------------------%s\n",g_pStrTime);
 875     }
 876     
 877 
 878     /*printf("+------进入目录--->\n+[%s]\n\r",chTemPath);*/    
 879     WriteFormatted(g_fpLog,"+------进入目录--->\n+[%s]\n",chTemPath);
 880     
 881     HANDLE hFind=::FindFirstFile(szFind,&FindFileData);    
 882     
 883     if(INVALID_HANDLE_VALUE == hFind)        
 884     {
 885         WriteFormatted(g_fpLog,"<%s>No %s file found\n",g_pStrTime,g_strFindFileType);    
 886         return;
 887     }
 888     
 889     while(TRUE)         
 890     {
 891         //If director, visit all sub-folders
 892         if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
 893         {
 894             g_lCheckFileNumber++;
 895             if(FindFileData.cFileName[0]!='.') 
 896             {
 897                 char szFile[MAX_PATH];
 898                 strcpy(szFile,lpPath); 
 899                 strcat(szFile,"\\");
 900                 /*strcat(chTemPath,szFile);*/
 901                 strcat(szFile,FindFileData.cFileName);
 902                 VisitAllFiles(szFile);
 903             } 
 904         } 
 905         else
 906         { 
 907             //Judge if TYPE file
 908             g_lCheckFileNumber++;
 909             /*printf(" -%s\n",FindFileData.cFileName);*/        
 910             
 911             int len = strlen(FindFileData.cFileName);
 912             int iStrLen = strlen(g_strFindFileType);
 913             
 914             //除去目录,共检查文件数            
 915             const char *p = (char *)&FindFileData.cFileName[len-iStrLen];        
 916             
 917             //case insentive!
 918             if ( (0 == strcmp("*",g_strFindFileType)) || (0 == strcmp("*.*",g_strFindFileType)) )
 919             {
 920                 //查看所有目录文件:
 921                 g_lCheckOkFileNumber++;
 922                 
 923                 //if exe file, check it
 924                 char strFileName[MAX_PATH];
 925                 strcpy(strFileName,lpPath); 
 926                 strcat(strFileName,"\\");
 927                 strcat(strFileName,FindFileData.cFileName);
 928                 WriteFormatted(g_fpLog,"<%s>已检查文件数:%ld,符合条件数:%ld,刚检查到的文件是:\n%s\n",
 929                     g_pStrTime,
 930                     g_lCheckFileNumber,
 931                     g_lCheckOkFileNumber,
 932                     strFileName);
 933                 
 934                 fprintf(g_fpCheckOK,"<%s> %s\n",
 935                     g_pStrTime,
 936                     strFileName);
 937             }
 938             
 939             else if ((_stricmp(p, g_strFindFileType) == 0)) 
 940             {
 941                 g_lCheckOkFileNumber++;
 942                 //if exe file, check it
 943                 char strFileName[MAX_PATH];
 944                 strcpy(strFileName,lpPath); 
 945                 strcat(strFileName,"\\");
 946                 strcat(strFileName,FindFileData.cFileName);
 947                 
 948                 WriteFormatted(g_fpLog,"<%s>已检查文件数:%ld,符合条件数:%ld,刚检查到的文件是:\n%s\n",
 949                     g_pStrTime,
 950                     g_lCheckFileNumber,
 951                     g_lCheckOkFileNumber,
 952                     strFileName);
 953                 
 954                 fprintf(g_fpCheckOK,"<%s> %s\n",
 955                     g_pStrTime,
 956                     strFileName);
 957                 
 958                 /* 置删除标志时,删除文件 */
 959                 /*if (CheckWHVirus(fp))*/
 960                 if (g_flagDeleteFile == FLAG_DELETE)
 961                 { 
 962                     /*PrintLocalTime(g_pStrTime);*/
 963                     /*ClearVirus(fp, strFileName);*/ //fp closed in the function
 964                     /*printf("Virus Found! %s and cleared\r\n", strFileName);*/
 965                     /* 去只读 */
 966                     SetFileAttributes(strFileName,FILE_ATTRIBUTE_NORMAL);
 967                     
 968                     /* Long,非零表示成功,零表示失败。会设置GetLastError */
 969                     //if (DeleteFile(strFileName))
 970                     if (!remove(strFileName))
 971                     {
 972                         g_lClearFileNumber++;
 973                         /*printf("Delete file: %s successfully,已清除文件数:%ld.\n", strFileName,g_lClearFileNumber);*/
 974                         WriteFormatted(g_fpLog,"<%s>---Delete file: %s successfully,已清除文件数:%ld.\n", g_pStrTime,strFileName,g_lClearFileNumber);
 975                     }
 976                     else
 977                     {
 978                         /*printf("Delete file: %s failed!\n", strFileName);*/
 979                         WriteFormatted(g_fpLog,"<%s>---Delete file: %s failed!\n", g_pStrTime,strFileName); 
 980                     } 
 981                 }
 982                 
 983                 /*system("cls");*/
 984                 
 985                 /*Sleep(SLEEP_SECOND);*/
 986             }
 987 } 
 988 
 989 
 990 //Find next file
 991 if(!FindNextFile(hFind,&FindFileData))
 992 {
 993     // printf("【OK,There is not %s type file in PATH %s】\n",TYPE,chTemPath);
 994     // fprintf(g_fpLog,"---------------->【OK,There is not %s type file any more in PATH %s】\n",TYPE,chTemPath);
 995     break; 
 996 }
 997 } 
 998 
 999 
1000 /*GetCurSysTime(g_pStrTime);*/
1001 /*fprintf(g_fpLog,"END---------------------------------------------------%s\n",g_pStrTime);*/
1002 
1003 FindClose(hFind);
1004 }
1005 
1006 
1007 //从配置文件中读取配置信息:
1008 //PATH:需要进行查找/删除的路径名
1009 //TYPE:需要进行查找的文件类型名称
1010 //DORV:是删除还是查看:0查看,1删除
1011 void ReadConfigFromFile()
1012 {
1013     FILE * fpConf = NULL;
1014     char strPathTemp[100];
1015     char strTypeTemp[10];
1016     /*char strCurTime[50];*/
1017     int flagDelOrView = 0;
1018     char strCfgFilePath[100];
1019     
1020     memset(strPathTemp,0,sizeof(strPathTemp));
1021     memset(strTypeTemp,0,sizeof(strTypeTemp));
1022     memset(strCfgFilePath,0,sizeof(strTypeTemp));
1023     
1024     
1025     GetCurrentDirectory(MAX_FIND_PATH,strCfgFilePath);
1026     
1027     if (NULL == (fpConf = fopen("config.cfg","r")))
1028     {
1029         WriteFormatted(g_fpLog,"Read config file error!!!->%s\n",strCfgFilePath);
1030         
1031         WriteFormatted(g_fpLog,"获取当前路径为:%s\n",strCfgFilePath);
1032         strcat(strCfgFilePath,"\\");
1033         strcat(strCfgFilePath,"config.cfg");
1034         
1035         if (NULL == (fpConf = fopen(strCfgFilePath,"w")))
1036         {
1037             WriteFormatted(g_fpLog,"Read config file error!!!->%s\n",strCfgFilePath);
1038             exit(0);
1039         }
1040     }
1041     
1042     GetCurSysTime(g_pStrTime);
1043     
1044     fscanf(fpConf,"PATH=%s\n",strPathTemp);
1045     fscanf(fpConf,"TYPE=%s\n",strTypeTemp);
1046     fscanf(fpConf,"DORV=%d\n",&flagDelOrView);
1047     
1048     WriteFormatted(g_fpLog,"\n读取的文件配置信息:\n",g_pStrTime);
1049     WriteFormatted(g_fpLog,"PATH=%s\n",strPathTemp);
1050     WriteFormatted(g_fpLog,"TYPE=%s\n",strTypeTemp);
1051     WriteFormatted(g_fpLog,"DORV=%d\n",flagDelOrView);
1052     
1053     if (!(strcmp(strPathTemp,"") && strcmp(strTypeTemp,"")))
1054     {
1055         WriteFormatted(g_fpLog,"\n配置为空,请修改配置文件\n");
1056         return;
1057     }
1058     
1059     strcpy(g_strFindFilePath,strPathTemp);
1060     strcpy(g_strFindFileType,strTypeTemp);
1061     g_flagDeleteFile = flagDelOrView;
1062     
1063     WriteFormatted(g_fpLog,"\n全局配置信息:\n",g_pStrTime);
1064     WriteFormatted(g_fpLog,"g_strFindFilePath=%s\n",g_strFindFilePath);
1065     WriteFormatted(g_fpLog,"g_strFindFileType=%s\n",g_strFindFileType);
1066     WriteFormatted(g_fpLog,"g_flagDeleteFile=%d\n",g_flagDeleteFile);
1067     
1068     fCloseFileFp(&fpConf);
1069     WriteFormatted(g_fpLog,"Read config successfully!!!\n");
1070     //Sleep(3000);
1071 }
1072 
1073 
1074 //保存配置到配置文件中:
1075 //PATH:需要进行查找/删除的路径名
1076 //TYPE:需要进行查找的文件类型名称
1077 //DORV:是删除还是查看:0查看,1删除
1078 void SaveConfigToFile()
1079 {
1080     FILE * fpConf = NULL;
1081     char strPathTemp[100];
1082     char strTypeTemp[10];
1083     /*char strCurTime[50];*/
1084     int flagDelOrView = 0;
1085     
1086     WriteFormatted(g_fpLog,"\n保存配置信息:\n");
1087     
1088     memset(strPathTemp,0,sizeof(strPathTemp));
1089     memset(strTypeTemp,0,sizeof(strTypeTemp));
1090     
1091     if (NULL == (fpConf = fopen("config.cfg","w")))
1092     {
1093         WriteFormatted(g_fpLog,"Read config file error !!!\n");
1094         return;
1095     }
1096     
1097     if (!(strcmp(g_strFindFilePath,"") && strcmp(g_strFindFileType,"")))
1098     {
1099         WriteFormatted(g_fpLog,"配置为空,请重新配置\n");
1100         return;
1101     }
1102     
1103     //将配置信息打印出来 
1104     //保存到配置文件中
1105     /*fprintf(g_fpLog,"<%s>全局配置信息:\n",g_pStrTime);*/
1106     fprintf(fpConf,"PATH=%s\n",g_strFindFilePath);
1107     fprintf(fpConf,"TYPE=%s\n",g_strFindFileType);
1108     fprintf(fpConf,"DORV=%d\n",g_flagDeleteFile);
1109     
1110     //将保存后的信息写到日志及标准输出中
1111     WriteFormatted(g_fpLog,"保存配置后的配置信息:\n",g_pStrTime);
1112     WriteFormatted(g_fpLog,"PATH=%s\n",g_strFindFilePath);
1113     WriteFormatted(g_fpLog,"TYPE=%s\n",g_strFindFileType);
1114     WriteFormatted(g_fpLog,"DORV=%d\n",g_flagDeleteFile);
1115     
1116     fCloseFileFp(&fpConf);
1117     WriteFormatted(g_fpLog,"Save config successfully!!!\n");
1118     //Sleep(3000);
1119 }
1120 
1121 
1122 void ModifyCfg()
1123 {
1124     char ch;
1125     
1126     while (1)
1127     {
1128         fflush(stdin);
1129         flushall();
1130         
1131         WriteFormatted(g_fpLog,"<%s>[m]",g_pStrTime);
1132         
1133         ch = getch();
1134         WriteFormatted(g_fpLog,"%c\n",ch);
1135         if (13 == ch)
1136         {
1137             continue;
1138         }
1139         else if ('1' == ch)
1140         {
1141             WriteFormatted(g_fpLog,"\n请输入路径:");
1142             scanf("%s",g_strFindFilePath);
1143             continue;
1144         }
1145         else if ('2' == ch)
1146         {
1147             WriteFormatted(g_fpLog,"\n请输入需要查找的文件类型:");
1148             scanf("%s",g_strFindFileType);
1149             continue;
1150         }    
1151         else if ('3' == ch)
1152         {
1153             WriteFormatted(g_fpLog,"\n请输入是查看还是删除:0:查看,2:删除\n");
1154             scanf("%d",&g_flagDeleteFile);
1155             //如果不是删除或查看的选择,默认为查看
1156             if ((g_flagDeleteFile != FLAG_DELETE) && (g_flagDeleteFile != FLAG_VIEW_FILE))
1157             {
1158                 g_flagDeleteFile = FLAG_VIEW_FILE;
1159             }
1160             continue;
1161         }
1162         else if ('q' == ch || 'e' == ch)
1163         {
1164             //SaveConfigToFile();
1165             break;
1166         }
1167         else if ('s' == ch)
1168         {
1169             //保存配置到配置文件中
1170             SaveConfigToFile();
1171             /*system("dir");*/
1172         }
1173         else if ('r' == ch)
1174         {
1175             //从文件中读取配置
1176             ReadConfigFromFile();
1177             /*system("dir");*/
1178         }
1179         else if ('?' == ch || 'h' == ch)
1180         {
1181             //WriteFormatted(g_fpLog,"\n\n");
1182             WriteFormatted(g_fpLog,"%s\n","\n修改配置文件:\n1.路径 \n2.文件类型 \n3.删除(0-查看,2-删除) \nq,e退出\n");
1183             continue;
1184         }
1185         else
1186         {
1187             WriteFormatted(g_fpLog,"\nInput error,please check it.\n\n");
1188             continue;
1189         }
1190     }
1191     
1192     
1193     
1194     // if(!strcmp("",g_strFindFilePath) || !strcmp("",g_strFindFileType))
1195     // {
1196     // WriteFormatted(g_fpLog,"竟然不输入路径和类型,想搞死我啊!!!\n");
1197     // /*GetCurrentDirectory(MAX_FIND_PATH,g_strFindFilePath);*/
1198     // // memset(g_strFindFileType,0,10);
1199     // // strcpy(g_strFindFileType,"log");
1200     // 
1201     // ReadConfigFromFile();
1202     // }
1203     
1204     
1205     
1206     
1207     
1208 #ifdef FLAG_DEBUG
1209     WriteFormatted(g_fpLog,
1210         "g_strFindFilePath:%s\n,g_strFindFileType:%s\n,g_flagDeleteFile:%d\n",
1211         g_strFindFilePath,
1212         g_strFindFileType,
1213         g_flagDeleteFile);
1214 #endif //FLAG_DEBUG 
1215 }
1216 
1217 
1218 void My_ShellExecute( HWND hwnd,
1219                      LPCTSTR lpOperation,
1220                      LPCTSTR lpFile,
1221                      LPCTSTR lpParameters,
1222                      LPCTSTR lpDirectory,
1223                      INT nShowCmd
1224                      )
1225 {
1226     HINSTANCE hRet = ShellExecute( hwnd,
1227         lpOperation,
1228         lpFile,
1229         lpParameters,
1230         lpDirectory,
1231         nShowCmd
1232         );
1233     int iRet = (int)hRet;
1234     switch(iRet)
1235     {
1236     case 0:
1237         WriteFormatted(g_fpLog,"The operating system is out of memory or resources.");
1238         break;
1239     case ERROR_FILE_NOT_FOUND:
1240         WriteFormatted(g_fpLog,"The specified file was not found.");
1241         break;
1242     case ERROR_PATH_NOT_FOUND:
1243         WriteFormatted(g_fpLog,"The specified file was not found.");
1244         break;
1245     case ERROR_BAD_FORMAT:
1246         WriteFormatted(g_fpLog,"The specified file was not found.");
1247         break;
1248     case SE_ERR_ACCESSDENIED:
1249         WriteFormatted(g_fpLog,"The specified file was not found.");
1250         break;
1251     case SE_ERR_ASSOCINCOMPLETE:
1252         WriteFormatted(g_fpLog,"The file name association is incomplete or invalid.");
1253         break;
1254     case SE_ERR_DDEBUSY:
1255         WriteFormatted(g_fpLog,"The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.");
1256         break;
1257     case SE_ERR_DDEFAIL:
1258         WriteFormatted(g_fpLog,"The DDE transaction failed.");
1259         break;
1260     case SE_ERR_DDETIMEOUT:
1261         WriteFormatted(g_fpLog,"The DDE transaction could not be completed because the request timed out.");
1262         break;
1263     case SE_ERR_DLLNOTFOUND:
1264         WriteFormatted(g_fpLog,"The specified DLL was not found.");
1265         break;
1266     default:
1267 #ifdef FLAG_DEBUG
1268         //失败返回值会小于或等于32
1269         if (iRet>32)
1270         {
1271             WriteFormatted(g_fpLog,"\n-----[Function]:My_ShellExecute successfully:%d-----\n",iRet);
1272         }
1273         else
1274         {
1275             WriteFormatted(g_fpLog,"===================Other:%d=======================",iRet);
1276         }
1277 #endif //FLAG_DEBUG
1278         
1279         break;
1280     }
1281 }
1282 
1283 
1284 void FileOptions()
1285 {
1286 #if 0
1287     printf("----------------------------------------------\n");
1288     printf("DeleteFile.exe (argv[1]) (argv[2]) (argv[3]) :\n");
1289     printf("argv[1]:绝对路径名(最后不加\\\n");
1290     printf("argv[2]:要查找or删除的文件类型\n");
1291     printf("argv[3]:标志:2--删除 其它--查看\n");
1292 #endif
1293     
1294     char ch;
1295     
1296     WriteFormatted(g_fpLog,STR_LOGO);
1297     
1298     while(1)
1299     {
1300         InitGlobalVar();
1301 #ifdef FLAG_DEBUG
1302         DebugAndPrintAllGlobalVar();
1303 #endif 
1304         //PRINTTOSCR(STR_HELP);
1305         //WriteFormatted(g_fpLog,STR_HELP);
1306         WriteFormatted(g_fpLog,"<%s>",g_pStrTime);
1307         flushall();
1308         fflush(stdin);
1309         ch = getch();
1310         WriteFormatted(g_fpLog,"%c\n",ch);
1311         
1312         if ('y' == ch || 'Y' == ch)
1313         {
1314             ModifyCfg(); 
1315             
1316             WriteFormatted(g_fpLog,"即将要查找%s下%s类型的文件了哦\n",g_strFindFilePath,g_strFindFileType);
1317             
1318             Sleep(3000);
1319             VisitAllFiles(g_strFindFilePath);
1320             
1321             //CloseOrFreeGlobalVar();
1322         }
1323         else if (ch =='q' || ch == 'e' || ch == 'Q' || ch == 'q')
1324         {
1325             int ret = MessageBoxA(NULL,"确定退出","确定退出 ",MB_YESNO);
1326             /*printf("--------------ret=%d-------------\n",ret);*/
1327             if (IDNO == ret)
1328             {
1329                 WriteFormatted(g_fpLog,"<你刚才选择了否,继续>\n");
1330                 continue;
1331             }
1332             
1333             WriteFormatted(g_fpLog,"<你刚才选择了是,退出>\n");
1334             flushall();
1335             //CloseOrFreeGlobalVar();
1336             break;
1337         }
1338         else if (ch == 'm')
1339         {
1340             ModifyCfg();
1341         }
1342         else if ('d' == ch)
1343         {
1344             DebugAndPrintAllGlobalVar();
1345         }
1346         else if ('?' == ch)
1347         {
1348             WriteFormatted(g_fpLog,STR_HELP);
1349         }
1350         else if ('s' == ch)
1351         {
1352             SaveConfigToFile();
1353         }
1354         else if ('t' == ch)
1355         {
1356             WriteFormatted(g_fpLog,"\n太懒了,这个是用做测试用的,大哥\n");
1357             Sleep(2000);
1358             ReadConfigFromFile();
1359             VisitAllFiles(g_strFindFilePath);
1360         }
1361         else if ('c' == ch)
1362         {
1363             //清屏
1364             system("cls");
1365         }
1366         else
1367         {
1368             //空格与回车,继续
1369             if (ch == ' ' || ch == 13)
1370             {
1371                 continue;
1372             }
1373             
1374             WriteFormatted(g_fpLog,"Input error,please check it.\n");
1375         }
1376         
1377         //printf("<Enter to continue>\n");
1378     }
1379     
1380     //退出时,打开文件
1381     My_ShellExecute(NULL, "edit","OutPut.txt" , NULL, NULL, SW_SHOWNORMAL|SW_SHOWMAXIMIZED);
1382     CloseOrFreeGlobalVar();
1383     /*getch();*/
1384 }
posted on 2012-06-06 00:13 kernel_main 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/kernel0815/archive/2012/06/06/2537492.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值