home *** CD-ROM | disk | FTP | other *** search
/ Programming Win32 Under the API / ProgrammingWin32UnderTheApiPatVillani.iso / Chapter9 / cmd32 / DEL.C < prev    next >
C/C++ Source or Header  |  2000-05-01  |  4KB  |  174 lines

  1. /****************************************************************/
  2. /*                                */
  3. /*                  del.c                */
  4. /*                                */
  5. /*            Copyright (c) 2000            */
  6. /*            Pasquale J. Villani            */
  7. /*            All Rights Reserved            */
  8. /*                                */
  9. /* This file is part of CMD32.                    */
  10. /*                                */
  11. /* CMD32 is free software; you can redistribute it and/or    */
  12. /* modify it under the terms of the GNU General Public License    */
  13. /* as published by the Free Software Foundation; either version    */
  14. /* 2, or (at your option) any later version.            */
  15. /*                                */
  16. /* CMD32 is distributed in the hope that it will be useful, but    */
  17. /* WITHOUT ANY WARRANTY; without even the implied warranty of    */
  18. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
  19. /* the GNU General Public License for more details.        */
  20. /*                                */
  21. /* You should have received a copy of the GNU General Public    */
  22. /* License along with CMD32; see the file COPYING.  If not,    */
  23. /* write to the Free Software Foundation, 675 Mass Ave,        */
  24. /* Cambridge, MA 02139, USA.                    */
  25. /****************************************************************/
  26.  
  27. /* $Logfile$ */
  28.  
  29. /* $Log$
  30.  * $EndLog$ */
  31.  
  32. /*
  33. typedef struct _WIN32_FIND_DATA { // wfd
  34.     DWORD dwFileAttributes; 
  35.     FILETIME ftCreationTime;
  36.     FILETIME ftLastAccessTime; 
  37.     FILETIME ftLastWriteTime;
  38.     DWORD    nFileSizeHigh; 
  39.     DWORD    nFileSizeLow;
  40.     DWORD    dwReserved0;
  41.     DWORD    dwReserved1; 
  42.     TCHAR    cFileName[ MAX_PATH ];
  43.     TCHAR    cAlternateFileName[ 14 ]; 
  44. } WIN32_FIND_DATA; 
  45. */
  46.  
  47. #include <windows.h>
  48. #include <string.h>
  49. #include "globals.h"
  50. #include "proto.h"
  51.  
  52. #ifdef VERSION_STRINGS
  53. static BYTE *RcsId = "$Header$";
  54. #endif
  55.  
  56. /* Local convienence define                        */
  57. #define FileDelete(file)    (DeleteFile((LPCTSTR)file))
  58.  
  59.  
  60. BOOL del(INT argc, char *argv[])
  61. {
  62.     WIN32_FIND_DATA  dmp;
  63.     HANDLE hDir;
  64.     BYTE szPattern[MAX_CMDLINE] = "";
  65.     BYTE szPath[MAX_CMDLINE] = "";
  66.     BYTE szDrive[3];
  67.     BYTE *pszSep;
  68.     BOOL pflag = FALSE;
  69.     BOOL deleted = FALSE;
  70.     INT nPatLen;
  71.     DWORD nRead;
  72.  
  73.     /* Make sure the user gave us a delete specification */
  74.     if((argc < 2) || (argc > 3))
  75.     {
  76.         error_message(INV_NUM_PARAMS);
  77.         return FALSE;
  78.     }
  79.  
  80.     scan_name(argv[1], szDrive, szPath, szPattern);
  81.  
  82.     if(strcmp(szPattern,"*.*") == 0)
  83.     {
  84.         BYTE line[MAX_CMDLINE] = "", *resp;
  85.  
  86.         FOREVER
  87.         {
  88.             printf("All files in directory will be deleted!\nAre you sure (Y/N)?");
  89.             ReadFile(hStdin, (LPVOID)line, (DWORD)1, &nRead, 0);
  90.  
  91.             resp = skipwh(line);
  92.             if(*resp == 'n' || *resp == 'N')
  93.             {
  94.                 return TRUE;
  95.             }
  96.             else if(*resp == 'y' || *resp == 'Y')
  97.                 break;
  98.             else
  99.                 continue;
  100.         }
  101.     }
  102.  
  103.     /* Look for the first (and maybe only) occurrance of the user    */
  104.         /* specified szPattern.                        */
  105.     if((hDir = FindFirstFile((LPCTSTR)argv[1], (LPWIN32_FIND_DATA)&dmp))
  106.         == INVALID_HANDLE_VALUE)
  107.     {
  108.         error_mess_str = szPattern;
  109.         error_message(FILE_NOT_FOUND);
  110.         return TRUE;
  111.     }
  112.  
  113.     /* Now follow standard DOS convention and loop through the    */
  114.     /* directory, expanding wild cards                */
  115.     do
  116.     {
  117.         BYTE szFileName[MAX_CMDLINE];
  118.  
  119.         /* Assemble a file name for each file found */
  120.         *szFileName = '\0';
  121.         if(*szDrive)
  122.         {
  123.             strcpy(szFileName, szDrive);
  124.             strcat(szFileName, ":");
  125.         }
  126.         if(*szPath)
  127.         {
  128.             strcat(szFileName, szPath);
  129.             strcat(szFileName, "\\");
  130.         }
  131.         strcat(szFileName, dmp.cFileName);
  132.  
  133.         /* Delete each file, and prompt if /p option    */
  134.         /* was issued.                    */
  135.         if(pflag)
  136.         {
  137.             BYTE line[MAX_CMDLINE] = "", *resp;
  138.  
  139.             FOREVER
  140.             {
  141.                 printf("Delete %s (Y/N)?", szFileName);
  142.                 ReadFile(hStdin, (LPVOID)line, (DWORD)1, &nRead, 0);
  143.  
  144.                 resp = skipwh(line);
  145.                 if(*resp == 'n' || *resp == 'N')
  146.                     break;
  147.                 else if(*resp == 'y' || *resp == 'Y')
  148.                 {
  149.                     if(!FileDelete(szFileName))
  150.                         error_message(ACCESS_DENIED);
  151.                     break;
  152.                 }
  153.                 else
  154.                     continue;
  155.             }
  156.         }
  157.         else
  158.         /* Just delete each file found.            */
  159.         {
  160.             if(FileDelete(szFileName))
  161.                 ++deleted;
  162.         }
  163.     }
  164.     while(FindNextFile (hDir, (LPWIN32_FIND_DATA)&dmp));
  165.  
  166.     /* Here's an oddball.  If we found a file, but could not delete    */
  167.     /* it, we need to warn the user.  So here it is.        */
  168.     if(!pflag && deleted < 1)
  169.         error_message(ACCESS_DENIED);
  170.  
  171.     CloseHandle(hDir);
  172. }
  173.  
  174.