home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / NDEL2.ZIP / NDEL2.C next >
C/C++ Source or Header  |  1991-07-17  |  8KB  |  220 lines

  1. /***************************************************************************
  2.  * NAME HEADER:      FILE  : NDEL2.C  (not delete for OS/2 and DOS)           *
  3.  *                AUTHOR: RAJESH NIHAL, compuserve [73427,1377]            *
  4.  *                DATE  : 6/11/90    UPDATE: 7/14/91                       *
  5.  *                SYS   : OS/2 1.x xE                                      *
  6.  *                PROG  : NDEL2 version 0.1 Copyright (c) 1991 RAJESH NIHAL*
  7.  *                REMARK: This program will delete all the files, Except   *
  8.  *                        those which are specified on the command line.   *
  9.  *                        Use this program as you wish (except abusing it).*
  10.  *                        If distributting, leave the name of the header   *
  11.  *              (this whole commented block) intact and          *
  12.  *                        do not change the run time help screen. I am NOT *
  13.  *                        responsible for any damages(so far works great). *
  14.  *                        Comments, Advises, Corrections are welcome. Next *
  15.  *                        version will have wildcard support.              *
  16.  *                PS    : THIS PROGRAM IS NOT A SHAREWEAR. DO NOT USE      *
  17.  *              WILDCARDS, IF USED WILL WIPE OUT EVERYTHING.     *
  18.  *              THE FILE[S] WHICH YOU SPECIFY ON THE COMMAND     *
  19.  *              LINE SHOULD NOT CONTAIN DIR PATH. THE PROGRAM    *
  20.  *                        WILL NOT DELETE ITSELF.                          *
  21.  *                                       *
  22.  * Compiler:              MSC 6.00A                                        *
  23.  * Compilation syntax:    cl /A{<S,M,C,L>} ndel.c                          *
  24.  * Runtime arguments:     ndel2 <filename(s)> | <?,-?,-h,/h>               *
  25.  * Special:               Use BIND under DOS to create a family exe        *
  26.  ***************************************************************************/
  27.  
  28. /******************************* HEADER FILES ******************************/
  29. #include <stdio.h>
  30. #include <os2.h>     //Don't really need it
  31. #include <direct.h>
  32. #include <dos.h>
  33. #include <string.h>
  34. #include <stdlib.h>
  35.  
  36. /******************************* DEFINES AND MACROS ************************/
  37. #define read_only 0x01
  38. #define archive 0x20
  39. #define getdir getcwd(buffer,128)
  40. /******************************* GLOBAL VARS *******************************/
  41. unsigned extern far pascal \
  42. DosFindFirst(char far *, unsigned far *, unsigned, void far *, \
  43.               int, int far *, unsigned long);
  44. // The above prototype produces warnings.
  45. // Maybe the type of the arguments has been changed for MSC 6.00A?
  46. /* .
  47.    .
  48.    .
  49.      more prototypes <don't wanna type>; may produce more warnings.
  50.    .
  51.    .
  52.    .
  53. */
  54.  
  55. int getfiles(void);
  56. int delete_file(char *);
  57. int tempargc;
  58. char near buffer[128];    // Buffer size could vary
  59. int err,i;
  60. char temp[100][12];
  61. char probuf[128];
  62. unsigned hand = -1;
  63. int ms = 1;
  64. struct buu {              // DosFind{First/Next} return struct
  65.                unsigned dt,tm,dtt,tmm,dttt,tmmm;
  66.                long fs,flc;
  67.                unsigned ft;
  68.                char fc;
  69.                char fn[13]; // This is used in the program
  70.            } bu;
  71.  
  72.  
  73. /******************************** MAIN MODULE ******************************/
  74. int main(int argc,char  *argv[])
  75. {
  76.    int f;
  77.    register int targc;
  78.    int pro;
  79.    if (argc == 1) 
  80.    {
  81.     printf("\a\n\n");
  82.     puts("Required parameter missing!");
  83.         //argv[0] [strlen(argv[0]) - 4] = NULL;  don't work under OS/2
  84.         printf("Synopsis: %s file[s].\n",argv[0]);
  85.     printf("Use %s [/? /h[H] -? -h[H] ? ] for help screen.\n",argv[0]);
  86.     exit (1);
  87.    }
  88.    if(argc > 1)                             
  89.    {
  90.     if((strcmp(argv[1],"/?")==0) || (strcmp(argv[1],"/h")==0) || 
  91.        (strcmp(argv[1],"-h")==0) || (strcmp(argv[1],"-?")==0) ||
  92.        (strcmp(argv[1],"-H")==0) || (strcmp(argv[1],"/H")==0) ||
  93.        (strcmp(argv[1],"?")==0))          
  94.     {
  95.         printf("%s Version 0.1 Copyright (c) 1991 RAJESH NIHAL\n",argv[0]);
  96.         printf("\nThis Utility Deletes all the files, except those specified");
  97.         printf(" on the command line\n"); 
  98.         printf("Syntax is : %s FILE(S)   leave a space between files.\n",argv[0]);
  99.         printf("Example : %s cc.exe  all the files except cc.exe will be deleted.\n",argv[0]);
  100.         printf("Example : %s awk.exe bc.exe prjcnvt.txt comp.txt\n",argv[0]);
  101.             printf("\aNO WILDCARDS!!\n");
  102.             exit (1);
  103.     }
  104. /*************************** EXTRACT THE NAME OF THE PROGRAM ****************/
  105.     pro = 0;
  106.     for(i=(strlen(argv[0])-1);i>=0;i--)
  107.     {
  108.         if(argv[0][i] == '\\')
  109.             break;
  110.         else
  111.             probuf[pro] = argv[0][i];
  112.         pro++;
  113.     
  114.     }
  115.  
  116.     strrev(probuf);
  117.  
  118. /*************************** SAVE THE GIVEN FILE NAMES **********************/
  119.     tempargc = argc;   /* why :')@#*&%? */
  120.     targc = tempargc;
  121.     i = 0;
  122.     while (argc != 1)
  123.     {
  124.           getdir;
  125.           strcpy(temp[i],argv[argc-1]);
  126.           if (strlen(buffer) > 3)        // if !root
  127.          strcat(buffer,"\\");
  128.  
  129.           strcat(buffer,temp[i]);
  130.           if(!DosFindFirst (buffer,&hand,0x20|0x00,\
  131.                                (void far *)&bu,sizeof(bu),&ms,0L))
  132.                   for(f=0;f <= 81;f++)
  133.              {
  134.                buffer[f] = 0;
  135.              }
  136.           else
  137.          {
  138.              printf("%s not found  ...program aborted.\n",temp[i]);
  139.              exit(-1);
  140.          }
  141.           argc--;
  142.           i++;
  143.     }
  144.        argc = targc;
  145.  
  146. /************************* MAKE THE GIVEN FILES READ ONLY *******************/
  147.     i = 0;
  148.  
  149.         DosSetFileMode(probuf,0x01,0);
  150.     while(argc != 1)
  151.     {
  152.         DosSetFileMode(temp[argc-2],0x01,0);
  153.         i++;
  154.         argc--;
  155.     }
  156.     argc = targc;
  157.  
  158. /******************** FIND THE REMAINING FILES AND DELETE THEM **************/
  159.  
  160.     getfiles();   // Just to make the program more readble
  161.  
  162. /************************* MAKE THE GIVEN FILES ARCHIVE ********************/
  163.     while(argc != 1)
  164.     {
  165.         DosSetFileMode(temp[argc-2],0x20,0);
  166.         argc--;
  167.     }
  168. /***************************************************************************/
  169.  
  170.     DosSetFileMode(probuf,0x20,0);  /* change the attrib of program to archive */
  171.    }   /* if argc > 1 */
  172.  
  173.    DosFindClose(hand);
  174. return 0;
  175. }      /* end main module */
  176.  
  177. /***************************************************************************/
  178. int delete_file(char *filename)            /* delete all the files */
  179. /***********
  180. * input: filename
  181. * output: Delete that file
  182. * Notes : Could have made nice inline function if OOP was Supported
  183. *         Could have made a macro too.
  184. ***********/
  185.  
  186. {
  187. #ifdef SHOW_NAMES      // Undocumented feature for NDEL2
  188.                       // Don't get nervous looking at the file names on screen
  189.     printf("deleting %s\n",filename);
  190. #endif
  191.    DosDelete(filename,0);
  192.  
  193.    return 0;
  194. }                                     
  195.  
  196.  
  197. /***************************************************************************/
  198. int getfiles(void)                         /* get all the files */
  199. {
  200.  
  201.    int done;
  202.    getdir;
  203.    if (strlen(buffer) > 3)
  204.       strcat(buffer,"\\*.*");              /* current dir and all the files */
  205.    else
  206.       strcat(buffer,"*.*");               /* current root dir and all the files */
  207.    done = DosFindFirst(buffer,&hand,0x20|0x00,\
  208.                       (void far *)&bu,sizeof(bu),&ms,0L); /* get first file */
  209.    delete_file(bu.fn);                   /* delete that file*/
  210.  
  211.    while (!done)
  212.    {
  213.       done = DosFindNext(hand,(void far *)&bu,\
  214.                          sizeof(bu),&ms); /* find next file */
  215.       err = delete_file(bu.fn);     /* delete that file */
  216.    }
  217.  
  218.    return 0;
  219. }
  220.