home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / m / msh_ut11.zip / RM.PAS < prev    next >
Pascal/Delphi Source File  |  1992-05-09  |  5KB  |  171 lines

  1. PROGRAM RM;
  2. {$V-,I-,S-,A+,R-}
  3. { A file-remove-program for use with the Mi-Shell }
  4. { You can always cancel the process by pressing   }
  5. { escape-key at (nearly) any time.                }
  6. { Written by Jens Pirnay in 1992                  }
  7. {-----------------------------------------------------}
  8. { Jens Pirnay <pirnay@rphs1.physik.uni-regensburg.de> }
  9. { This file is subject to the copyleft-regulations    }
  10. { of the Free Software Foundation (the guys from GNU) }
  11. {-----------------------------------------------------}
  12.  
  13. { DEFINE German} { For german messages instead of english }
  14.  
  15. USES DOS, CRT, MSHSupport, MiniWindow;
  16.  
  17. VAR i, j  : WORD;
  18.     Tmp   : STRING;
  19. CONST doall     : BOOLEAN = FALSE;
  20.       recursion : BOOLEAN = FALSE;
  21.  
  22.    PROCEDURE KillFiles (files : STRING; askdir : BOOLEAN);
  23.    VAR S       : SearchRec;
  24.        F       : FILE;
  25.        BaseDir : STRING [127];
  26.        doit    : BOOLEAN;
  27.        Name    : STRING [8];
  28.        Ext     : STRING [4];
  29.        answer  : BYTE;
  30.        doserr  : INTEGER;
  31.    BEGIN
  32.      FSplit (Files, BaseDir, Name, Ext);
  33.      FINDFIRST (Files, AnyFile, S);
  34.      doserr := DOSError;
  35.      WHILE doserr = 0 DO
  36.      BEGIN
  37.        IF KEYPRESSED THEN
  38.        BEGIN
  39.          IF READKEY = #27 THEN
  40.            HALT;
  41.        END;
  42.        WITH S DO
  43.        BEGIN
  44.          doit := TRUE;
  45.  
  46.          IF (S.Attr AND Directory <> 0) AND
  47.             (S.Name <> '.') AND (S.Name <> '..')
  48.             AND recursion THEN
  49.          BEGIN
  50.            IF askdir THEN
  51.            BEGIN
  52.            {$IFDEF German}
  53.              answer :=  Alert ('Wollen Sie das Verzeichnis:||>> ' + S.Name +
  54.                                ' <<||wirklich löschen', ' Ja |Nein|Rekursiv');
  55.             {$ELSE}
  56.              answer :=  Alert ('Do you really want to delete|this directory:||>> '
  57.                               + S.Name + ' <<', 'Yes| No |Recursive');
  58.             {$ENDIF}
  59.             IF answer = 255 THEN HALT;
  60.            END
  61.            ELSE
  62.              answer := 3;
  63.            IF (answer = 1) OR (answer = 3) THEN
  64.            BEGIN
  65.              IF answer = 3 THEN
  66.                KillFiles (BaseDir + S.Name + '\*.*', FALSE);
  67.              RMDIR (BaseDir + S.Name);
  68.              IF IORESULT <> 0 THEN ;
  69.            END;
  70.          END
  71.          ELSE
  72.          BEGIN
  73.            IF (S.Attr AND ReadOnly <> 0) THEN
  74.            BEGIN
  75.              IF doall THEN
  76.              BEGIN
  77.                answer := 3;
  78.              END
  79.              ELSE
  80.              BEGIN
  81.              {$IFDEF German}
  82.                answer :=
  83.                 Alert ('Folgende Datei ist schreibgeschützt:||>> ' +
  84.                       S.Name + ' <<||Trotzdem löschen?', '  Ja  | Nein | Alle ');
  85.               {$ELSE}
  86.                answer :=
  87.                 Alert ('File is write-protected:||>> ' +
  88.                       S.Name + ' <<||Delete anyway?', ' Yes | No | All ');
  89.               {$ENDIF}
  90.              END;
  91.              IF answer = 255 THEN HALT; { Escape }
  92.              IF answer = 3 THEN
  93.                doall := TRUE;
  94.              IF answer = 2 THEN
  95.              BEGIN
  96.                doit := FALSE;
  97.              END
  98.              ELSE
  99.              BEGIN
  100.                ASSIGN (F, BaseDir + S.Name);
  101.                SETFATTR (F, Archive);
  102.                CLOSE (F);
  103.                IF IORESULT = 0 THEN ;
  104.              END;
  105.            END;
  106.            IF doit THEN
  107.            BEGIN
  108.              ASSIGN (F, BaseDir + S.Name);
  109.              ERASE (F);
  110.              IF IORESULT = 0 THEN ;
  111.            END;
  112.        END;
  113.        END;
  114.        FINDNEXT (S);
  115.        doserr := DOSError;
  116.      END;
  117.    END;
  118.  
  119.   PROCEDURE help;
  120.   begin
  121.    {$IFDEF German}
  122.      WRITELN ('Aufruf: rm [-rf] Datei(en)');
  123.      WRITELN ('  löscht auch Unterverzeichnisse,       falls "-r"');
  124.      WRITELN ('  fragt nicht bei Verzeichnissen oder');
  125.      WRITELN ('  schreibgeschützten Dateien nach,      falls "-f"');
  126.    {$ELSE}
  127.      WRITELN ('Usage: rm [-rf] file(s)');
  128.      WRITELN ('  deletes even subdirectories,      if "-r"');
  129.      WRITELN ('  does not confirm deletion for');
  130.      WRITELN ('  directories or read-only files,   if "-f"');
  131.    {$ENDIF}
  132.   end;
  133.  
  134.   PROCEDURE Get_Param (VAR First_Param : WORD);
  135.     VAR pc, psp : INTEGER;
  136.         st      : STRING;
  137.  
  138.     PROCEDURE select ( ch : CHAR; st : STRING; VAR action : BOOLEAN );
  139.     BEGIN
  140.       IF (POS (ch, st) > 1) OR (POS (UPCASE (ch), st) > 1)
  141.         THEN action := TRUE;
  142.     END;
  143.  
  144.   BEGIN {Get_Param}
  145.     pc  := MSHParamCount;
  146.     psp := 1;
  147.     st  := COPY (MSHParamStr (psp), 1, 1);
  148.     WHILE (st [1] = '/') OR (st [1] = '-') DO BEGIN
  149.       select ('r', MSHParamStr (psp), recursion);
  150.       select ('f', MSHParamStr (psp), doall);
  151.       INC (psp);
  152.       IF pc < psp THEN help;
  153.       st := COPY (MSHParamStr (psp), 1, 1);
  154.     END;
  155.     First_Param := psp;
  156.   END; {Get_Param}
  157.  
  158. BEGIN
  159.   IF MSHParamCount > 0 THEN
  160.   BEGIN
  161.     Get_param(j);
  162.     FOR i := j TO MSHParamCount DO
  163.     BEGIN
  164.       tmp := MSHParamStr (i);
  165.       KillFiles (tmp, NOT doall);  { ask if directory }
  166.     END;
  167.   END
  168.   ELSE
  169.     help;
  170. END.
  171.