home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / dirutl / ddel124.arc / DIRDEL.MOD < prev   
Encoding:
Text File  |  1989-07-15  |  4.3 KB  |  180 lines

  1. MODULE DirDel;
  2.  
  3.   IMPORT SYSTEM, FIO, IO, Lib, Str;
  4.  
  5.   IMPORT AltFIO;
  6.   FROM AltFIO IMPORT ReadOnly, Hidden, System, Directory;
  7.  
  8.   CONST Ver = "1.24";
  9.         MoYr = "07/89";
  10.  
  11.         Attr = {Hidden, System, Directory};
  12.  
  13.   VAR fileCount, dirCount: CARDINAL;
  14.  
  15.   PROCEDURE DispPrgmID;
  16.   BEGIN
  17.     IO.WrStr("DIRDEL-Directory Delete, Version ");
  18.     IO.WrStr(Ver);
  19.     IO.WrStr(", ");
  20.     IO.WrStr(MoYr);
  21.     IO.WrStr(", rtk");
  22.     IO.WrLn; IO.WrLn
  23.   END DispPrgmID;
  24.  
  25.   PROCEDURE WrDelMsg(pathname: ARRAY OF CHAR);
  26.   BEGIN
  27.     IO.WrStr( "  " );
  28.     IO.WrStr( pathname );
  29.     IO.WrStr( " ... deleted." );
  30.     IO.WrLn
  31.   END WrDelMsg;
  32.  
  33.   PROCEDURE Confirm(pathname: ARRAY OF CHAR): BOOLEAN;
  34.     VAR ch, sc: CHAR;
  35.   BEGIN
  36.     IO.WrStr("Delete directory ");
  37.     IO.WrStr(pathname);
  38.     IO.WrStr(" ? (Y/N): ");
  39.  
  40.     REPEAT
  41.       ch := CAP( IO.RdKey() );
  42.       IF ch = 0C THEN sc := IO.RdKey() END (* toss scan code *)
  43.     UNTIL (ch = 'Y') OR (ch = 'N');
  44.  
  45.     IO.WrLn;
  46.     RETURN ch = 'Y'
  47.   END Confirm;
  48.  
  49.   PROCEDURE MakeEmpty(dirName: ARRAY OF CHAR);
  50.     VAR D: FIO.DirEntry;
  51.         found: BOOLEAN;
  52.         wildCard, newPath: AltFIO.PathName;
  53.   BEGIN
  54.     IF dirName[ Str.Length(dirName)-1 ] # '\' THEN
  55.       Str.Append(dirName, "\")
  56.     END;
  57.  
  58.     Str.Concat(wildCard, dirName, "*.*");
  59.  
  60.     found := AltFIO.ReadFirstEntry(wildCard, FIO.FileAttr(Attr), D);
  61.  
  62.     WHILE found DO
  63.       IF D.Name[0] # '.' THEN   (* skip "." and ".." *)
  64.         Str.Concat(newPath, dirName, D.Name);
  65.  
  66.         IF ~(Directory IN BITSET(D.attr)) THEN  (* it's a file *)
  67.  
  68.           IF ReadOnly IN BITSET(D.attr) THEN
  69.             AltFIO.SetAttr(newPath, FIO.FileAttr{}) (* clear attr *)
  70.           END;
  71.  
  72.           AltFIO.Erase(newPath);
  73.           INC(fileCount)
  74.         ELSE                                    (* it's a directory *)
  75.           MakeEmpty( newPath );
  76.  
  77.           IF ReadOnly IN BITSET(D.attr) THEN
  78.             AltFIO.SetAttr(newPath, FIO.FileAttr{}) (* clear attr *)
  79.           END;
  80.  
  81.           AltFIO.RmDir(newPath);
  82.           INC(dirCount);
  83.           WrDelMsg(newPath)
  84.         END
  85.       END;
  86.       found := AltFIO.ReadNextEntry(D)
  87.     END
  88.   END MakeEmpty;
  89.  
  90.   PROCEDURE Report;
  91.   BEGIN
  92.     IO.WrLn;
  93.     IO.WrCard(fileCount,1);
  94.     IO.WrStr(" file");
  95.  
  96.     IF fileCount # 1 THEN IO.WrChar('s') END;
  97.  
  98.     IO.WrStr(" and ");
  99.     IO.WrCard(dirCount,1);
  100.     IO.WrStr(" director");
  101.  
  102.     IF dirCount # 1 THEN
  103.       IO.WrStr("ies")
  104.     ELSE
  105.       IO.WrChar('y')
  106.     END;
  107.  
  108.     IO.WrStr(" deleted.");
  109.     IO.WrLn
  110.   END Report;
  111.  
  112.   PROCEDURE ChangeDirectory(VAR currDir: ARRAY OF CHAR;
  113.                             pathname: ARRAY OF CHAR);
  114.     VAR i: CARDINAL;
  115.   BEGIN
  116.     Str.Copy(currDir, pathname);
  117.     i := Str.Length(currDir) - 1;
  118.  
  119.     WHILE currDir[i] # '\' DO
  120.       currDir[i] := 0C;
  121.       DEC(i)
  122.     END;
  123.     IF currDir[i-1] # ':' THEN
  124.       currDir[i] := 0C
  125.     END;
  126.  
  127.     AltFIO.ChDir(currDir)
  128.   END ChangeDirectory;
  129.  
  130.   CONST ht = CHR(9);
  131.  
  132.   VAR pathname, currDir: AltFIO.PathName;
  133.       D: FIO.DirEntry;
  134.       found: BOOLEAN;
  135.       drive: SHORTCARD;
  136.  
  137. BEGIN
  138.   DispPrgmID;
  139.   IF Lib.ParamCount() # 1 THEN
  140.     AltFIO.WrErr(ht+"Usage", " dirdel [drive][path]dirname")
  141.   ELSE
  142.     Lib.ParamStr( pathname, 1 );
  143.     Str.Caps(pathname);
  144.  
  145.     IF (Str.Pos(pathname, "?") # MAX(CARDINAL)) OR
  146.        (Str.Pos(pathname, "*") # MAX(CARDINAL)) THEN
  147.       AltFIO.WrErr(pathname, "Wildcards not allowed");
  148.     ELSE
  149.       AltFIO.FormName(pathname, drive, currDir);
  150.       found := AltFIO.ReadFirstEntry(pathname, FIO.FileAttr(Attr), D);
  151.       IF ~found THEN
  152.         AltFIO.WrErr(pathname, "Directory not found")
  153.       ELSIF ~(Directory IN BITSET(D.attr)) THEN
  154.         AltFIO.WrErr(pathname, "Not a directory")
  155.       ELSE
  156.         AltFIO.AddDrive(drive, currDir);
  157.  
  158.         IF Str.Pos(currDir, pathname) # MAX(CARDINAL) THEN
  159.           ChangeDirectory(currDir, pathname)
  160.         END;
  161.  
  162.         IF Confirm(pathname) THEN
  163.           IO.WrLn;
  164.           fileCount := 0; dirCount := 0;
  165.           MakeEmpty( pathname );
  166.  
  167.           IF ReadOnly IN BITSET(D.attr) THEN
  168.             AltFIO.SetAttr(pathname, FIO.FileAttr{}) (* clear attr *)
  169.           END;
  170.  
  171.           AltFIO.RmDir(pathname);
  172.           INC(dirCount);
  173.           WrDelMsg(pathname);
  174.           Report
  175.         END
  176.       END
  177.     END
  178.   END
  179. END DirDel.
  180.