home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / VDEL.ZIP / VDEL.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-13  |  9.3 KB  |  356 lines

  1. PROGRAM VDel (InFileSpec, Options);
  2.  
  3. {$B-,D+,R-,S-,V-}
  4.  
  5. USES DOS, CRT;
  6.  
  7. CONST
  8.   Bell       = #7;
  9.   No         = False;
  10.   Yes        = True;
  11.   NL         = #13#10;
  12.  
  13. TYPE
  14.   Line      = STRING[65];
  15.   ShortLine = STRING[4];
  16.  
  17. VAR
  18.   InFile      : FILE;
  19.   InFileSpec  : Line;
  20.   InPath      : Line;
  21.   Version     : Line;
  22.   Verify      : BOOLEAN;
  23.   Test        : BOOLEAN;
  24.   AllFiles    : BOOLEAN;
  25.   NumDel      : WORD;
  26.  
  27. {
  28. ┌────────────────────────────────────────────────────┐
  29. │ PROCEDURE Usage                                    │
  30. └────────────────────────────────────────────────────┘
  31. }
  32. PROCEDURE Usage;
  33.  
  34. BEGIN
  35.   WRITELN (Output,Bell,
  36. 'A file deletion program that asks confirmation for each delete.  VDEL works',NL,
  37. 'very much like the DOS "DEL" command, except that it prompts the user on a',NL,
  38. 'file-by-file basis as to whether each file should be deleted.  ',NL,
  39. '',NL,
  40. 'USAGE:     VDEL {path}[filename] /N /A /T',NL,
  41. '',NL,
  42. '           Wildcards (* and ?) may be used.',NL,
  43. '',NL,
  44. '           /N - No verification',NL,
  45. '           /A - All files: include read only, system, and hidden files',NL,
  46. '           /T - Test; shows only the files that would be selected, but does',NL,
  47. '                not delete any files.',NL);
  48.  
  49.   Halt;
  50. END;
  51.  
  52. {
  53. ┌────────────────────────────────────────────────────┐
  54. │ PROCEDURE Beep                                     │
  55. └────────────────────────────────────────────────────┘
  56. }
  57.  
  58. PROCEDURE Beep (message : STRING);
  59.  
  60. BEGIN
  61.   WRITELN (Output, NL, message, NL);
  62.   SOUND (560);
  63.   DELAY (50);
  64.   NOSOUND;
  65. END;
  66.  
  67. {
  68. ┌────────────────────────────────────────────────────┐
  69. │ PROCEDURE Error_Message                            │
  70. └────────────────────────────────────────────────────┘
  71. }
  72.  
  73. PROCEDURE Error_Message (message : STRING);
  74.  
  75. BEGIN
  76.   WRITELN (Output, Bell, NL, message, NL);      { ding bell & write message }
  77.   HALT;
  78. END;
  79.  
  80. {
  81. ┌────────────────────────────────────────────────────┐
  82. │ FUNCTION Format_Num                                │
  83. └────────────────────────────────────────────────────┘
  84. }
  85.  
  86. FUNCTION Format_Num (Num : LONGINT) : Line;
  87.  
  88. VAR
  89.   NumStr : Line;
  90.  
  91. BEGIN
  92.   STR (Num, NumStr);
  93.   IF (LENGTH (NumStr) > 6) THEN                  { Insert millions comma    }
  94.     INSERT (',',NumStr,(LENGTH(NumStr) - 5));
  95.  
  96.   IF (LENGTH (NumStr) > 3) THEN                  { Insert thousands comma   }
  97.     INSERT (',',NumStr,(LENGTH(NumStr) - 2));
  98.  
  99.   Format_Num := NumStr;
  100. END;
  101.  
  102. {
  103. ┌────────────────────────────────────────────────────┐
  104. │ FUNCTION Pad                                       │
  105. └────────────────────────────────────────────────────┘
  106. }
  107.  
  108. FUNCTION Pad (Num : INTEGER) : Line;
  109.  
  110. VAR
  111.   StrV : Line;
  112.  
  113. BEGIN
  114.   STR (Num, StrV);
  115.   IF LENGTH (StrV) = 1 THEN
  116.     StrV := '0' + StrV;
  117.   IF LENGTH (StrV) > 2 THEN                  {gets last 2 digits of Year}
  118.     Pad := StrV[3] + StrV[4]
  119.   ELSE
  120.     Pad := StrV;
  121. END;
  122.  
  123. {
  124. ┌────────────────────────────────────────────────────┐
  125. │ FUNCTION Meridian                                  │
  126. └────────────────────────────────────────────────────┘
  127. }
  128.  
  129. FUNCTION Meridian (Hour, Min : INTEGER) : Line;
  130.  
  131. BEGIN
  132.   IF Hour > 12 THEN
  133.     BEGIN
  134.       DEC (Hour,12);
  135.       Meridian := Pad (Hour) + ':' + Pad (Min) + ' pm';
  136.     END
  137.   ELSE
  138.     Meridian := Pad (Hour) + ':' + Pad (Min) + ' am';
  139. END;
  140.  
  141. {
  142. ┌────────────────────────────────────────────────────┐
  143. │ FUNCTION Get_Attr                                  │
  144. └────────────────────────────────────────────────────┘
  145. }
  146.  
  147. FUNCTION Get_Attr (AttrV : BYTE) : ShortLine;
  148.  
  149. VAR
  150.   Attr : Line;
  151.  
  152. BEGIN
  153.   Attr := 'N   ';
  154.   IF AttrV AND ARCHIVE <> 0 THEN
  155.     Attr[1] := 'A';
  156.   IF AttrV AND READONLY <> 0 THEN
  157.     Attr[2] := 'R';
  158.   IF AttrV AND HIDDEN <> 0 THEN
  159.     Attr[3] := 'H';
  160.   IF AttrV AND SYSFILE <> 0 THEN
  161.     Attr[4] := 'S';
  162.   Get_Attr := Attr;
  163. END;
  164.  
  165. {
  166. ┌────────────────────────────────────────────────────┐
  167. │ PROCEDURE DelFile                                  │
  168. └────────────────────────────────────────────────────┘
  169. }
  170.  
  171. PROCEDURE DelFile (AllFilesV : BOOLEAN; NameV : Line; message : Line);
  172.  
  173. VAR
  174.   DelFile : File;
  175.  
  176. BEGIN
  177.   ASSIGN (DelFile, NameV);
  178.   IF AllFilesV THEN
  179.     SetFAttr (DelFile, Archive);
  180.   ERASE (DelFile);
  181.   WRITELN (Output, message);
  182. END;
  183.  
  184. {
  185. ┌────────────────────────────────────────────────────┐
  186. │ PROCEDURE Test_for_Del                             │
  187. └────────────────────────────────────────────────────┘
  188. }
  189.  
  190. PROCEDURE Test_for_Del (InFileSpecV, InPathV : Line;
  191.                         VerifyV, TestV, AllFilesV : BOOLEAN;
  192.                         VAR NumDelV : WORD);
  193.  
  194. VAR
  195.   FileV     : SearchRec;
  196.   Ch        : CHAR;
  197.   SearchV   : WORD;
  198.   DateTimeV : DateTime;
  199.   DT_Str    : Line;
  200.  
  201. BEGIN
  202.   NumDelV := 0;
  203.  
  204.   IF AllFilesV THEN
  205.     SearchV := $27  {normal files plus archive, RO, sys, hidden files}
  206.   ELSE
  207.     SearchV := $20; {normal plus archive files}
  208.  
  209.   WRITELN (Output, 'Presenting selected files in ',InPathV, NL);
  210.   WRITELN (Output, 'File Name    Attrs.      Size  Date      Time        Action (Q to quit)');
  211.   WRITELN (Output, '───────────────────────────────────────────────────────────────────────');
  212.  
  213.   FindFirst (InFileSpecV, SearchV, FileV);
  214.   IF DosError <> 0 THEN
  215.     WRITELN (Output, ' -- Matching file not found')
  216.   ELSE
  217.     WHILE DosError = 0 DO
  218.       BEGIN
  219.         IF AllFilesV OR (NOT AllFiles AND (FileV.Attr <> $01)) THEN
  220.                         {this test is here because TP4.0 FindFirst does}
  221.                         {NOT ignore ReadOnly files when Attr is 00H or }
  222.                         {20H                                           }
  223.           BEGIN
  224.             UnPackTime (FileV.Time, DateTimeV);
  225.             DT_Str := PAD(DateTimeV.Month) + '-' + PAD(DateTimeV.Day) + '-' +
  226.                       PAD(DateTimeV.Year) + '  ' +
  227.                       MERIDIAN(DateTimeV.Hour, DateTimeV.Min);
  228.             WRITE (Output, FileV.Name, '':14 - LENGTH (FileV.Name),
  229.                    Get_Attr (FileV.Attr),'  ', Format_Num (FileV.Size):9,
  230.                    '  ', DT_Str);
  231.             IF Test THEN
  232.               WRITELN (Output, ' -- NOT deleted')
  233.             ELSE
  234.               IF Verify THEN
  235.                 BEGIN
  236.                   WRITE (Output, ' -- Delete?  (Y or N) ');
  237.                   Ch := ReadKey;
  238.                   CASE Ch OF
  239.                      'y','Y' : BEGIN
  240.                                  DelFile (AllFilesV, InPathV + FileV.Name,'√');
  241.                                  INC (NumDelV);
  242.                                END;
  243.                      'q','Q',
  244.                      'x','X',
  245.                      #27     : BEGIN
  246.                                  WRITELN (Output,NL);
  247.                                  Exit;
  248.                                END;
  249.                   ELSE
  250.                      WRITELN (Output)
  251.                   END {case};
  252.                 END
  253.               ELSE
  254.                 DelFile (AllFilesV, InPathV + FileV.Name,' -- File deleted');
  255.           END;
  256.         FindNext (FileV);
  257.       END;
  258.  
  259.   IF Test THEN
  260.     WRITELN (Output,NL,'Test specified -- directory files not deleted');
  261.  
  262. END;
  263.  
  264. {
  265. ┌────────────────────────────────────────────────────┐
  266. │ PROCEDURE Read_Params                              │
  267. └────────────────────────────────────────────────────┘
  268. }
  269.  
  270. PROCEDURE Read_Params (VAR InFileSpecV : Line;
  271.                        VAR InPathV     : Line;
  272.                        VAR VerifyV     : BOOLEAN;
  273.                        VAR TestV       : BOOLEAN;
  274.                        VAR AllFiles    : BOOLEAN);
  275.  
  276.     {
  277.     ┌────────────────────────────────────────────────────┐
  278.     │ SUB FUNCTION UpStr                                 │
  279.     └────────────────────────────────────────────────────┘
  280.     }
  281.     FUNCTION UpStr (Str : Line) : Line;
  282.     VAR
  283.       i : WORD;
  284.     BEGIN
  285.       FOR i := 1 TO LENGTH (Str) DO
  286.         Str[i] := UPCASE(Str[i]);
  287.       UpStr := Str;
  288.     END;
  289.  
  290. VAR
  291.   Param2 : Line;
  292.   i      : INTEGER;
  293.  
  294. BEGIN
  295.   VerifyV     := Yes;
  296.   TestV       := No;
  297.   AllFiles    := No;
  298.   i           := 0;
  299.  
  300.   IF (ParamCount = 0) OR (ParamStr(1) = '?') OR (ParamStr(1) = '/?') THEN
  301.     Usage
  302.   ELSE
  303.     BEGIN
  304.       InFileSpecV   := UpStr (ParamStr(1));
  305.       WHILE InFileSpecV [LENGTH (InFileSpecV) - i] <> '\' DO
  306.         INC (i);
  307.       InPathV := COPY (InFileSpecV, 1, LENGTH (InFileSpecV) - i);
  308.       IF LENGTH (InPathV) = 0 THEN
  309.         BEGIN
  310.           GETDIR (0,InPathV);
  311.           IF LENGTH (InPathV) <> 3 THEN
  312.             InPathV := InPathV + '\';
  313.         END;
  314.  
  315.       FOR i := 2 TO ParamCount DO
  316.         BEGIN
  317.           Param2 := UpStr (ParamStr(i));
  318.           IF Param2[1] = '/' THEN
  319.             CASE Param2[2] OF
  320.               'N' :  VerifyV  := No;
  321.               'T' :  TestV    := Yes;
  322.               'A' :  AllFiles := Yes;
  323.             END
  324.         END;
  325.     END;
  326. END;
  327.  
  328. {
  329. ┌────────────────────────────────────────────────────┐
  330. │ MAIN PROGRAM                                       │
  331. └────────────────────────────────────────────────────┘
  332. }
  333.  
  334. BEGIN
  335.  
  336.   Version := 'Version 1.1, 9-13-88 -- Public Domain by John Land';
  337.  
  338.   ASSIGN (Output,'');
  339.   REWRITE (Output);
  340.  
  341.   Read_Params (InFileSpec, InPath, Verify, Test, AllFiles);
  342.  
  343.   ClrScr;
  344.  
  345.   WRITELN (Output);
  346.  
  347.   Test_for_Del (InFileSpec, InPath, Verify, Test, AllFiles, NumDel);
  348.  
  349.   WRITELN (Output, NL,'Number of files deleted: ', NumDel);
  350.  
  351.   Beep ('Processing done.');
  352.  
  353.   CLOSE (Output);
  354.  
  355. END.
  356.