home *** CD-ROM | disk | FTP | other *** search
- MODULE DirDel;
-
- IMPORT SYSTEM, FIO, IO, Lib, Str;
-
- IMPORT AltFIO;
- FROM AltFIO IMPORT ReadOnly, Hidden, System, Directory;
-
- CONST Ver = "1.24";
- MoYr = "07/89";
-
- Attr = {Hidden, System, Directory};
-
- VAR fileCount, dirCount: CARDINAL;
-
- PROCEDURE DispPrgmID;
- BEGIN
- IO.WrStr("DIRDEL-Directory Delete, Version ");
- IO.WrStr(Ver);
- IO.WrStr(", ");
- IO.WrStr(MoYr);
- IO.WrStr(", rtk");
- IO.WrLn; IO.WrLn
- END DispPrgmID;
-
- PROCEDURE WrDelMsg(pathname: ARRAY OF CHAR);
- BEGIN
- IO.WrStr( " " );
- IO.WrStr( pathname );
- IO.WrStr( " ... deleted." );
- IO.WrLn
- END WrDelMsg;
-
- PROCEDURE Confirm(pathname: ARRAY OF CHAR): BOOLEAN;
- VAR ch, sc: CHAR;
- BEGIN
- IO.WrStr("Delete directory ");
- IO.WrStr(pathname);
- IO.WrStr(" ? (Y/N): ");
-
- REPEAT
- ch := CAP( IO.RdKey() );
- IF ch = 0C THEN sc := IO.RdKey() END (* toss scan code *)
- UNTIL (ch = 'Y') OR (ch = 'N');
-
- IO.WrLn;
- RETURN ch = 'Y'
- END Confirm;
-
- PROCEDURE MakeEmpty(dirName: ARRAY OF CHAR);
- VAR D: FIO.DirEntry;
- found: BOOLEAN;
- wildCard, newPath: AltFIO.PathName;
- BEGIN
- IF dirName[ Str.Length(dirName)-1 ] # '\' THEN
- Str.Append(dirName, "\")
- END;
-
- Str.Concat(wildCard, dirName, "*.*");
-
- found := AltFIO.ReadFirstEntry(wildCard, FIO.FileAttr(Attr), D);
-
- WHILE found DO
- IF D.Name[0] # '.' THEN (* skip "." and ".." *)
- Str.Concat(newPath, dirName, D.Name);
-
- IF ~(Directory IN BITSET(D.attr)) THEN (* it's a file *)
-
- IF ReadOnly IN BITSET(D.attr) THEN
- AltFIO.SetAttr(newPath, FIO.FileAttr{}) (* clear attr *)
- END;
-
- AltFIO.Erase(newPath);
- INC(fileCount)
- ELSE (* it's a directory *)
- MakeEmpty( newPath );
-
- IF ReadOnly IN BITSET(D.attr) THEN
- AltFIO.SetAttr(newPath, FIO.FileAttr{}) (* clear attr *)
- END;
-
- AltFIO.RmDir(newPath);
- INC(dirCount);
- WrDelMsg(newPath)
- END
- END;
- found := AltFIO.ReadNextEntry(D)
- END
- END MakeEmpty;
-
- PROCEDURE Report;
- BEGIN
- IO.WrLn;
- IO.WrCard(fileCount,1);
- IO.WrStr(" file");
-
- IF fileCount # 1 THEN IO.WrChar('s') END;
-
- IO.WrStr(" and ");
- IO.WrCard(dirCount,1);
- IO.WrStr(" director");
-
- IF dirCount # 1 THEN
- IO.WrStr("ies")
- ELSE
- IO.WrChar('y')
- END;
-
- IO.WrStr(" deleted.");
- IO.WrLn
- END Report;
-
- PROCEDURE ChangeDirectory(VAR currDir: ARRAY OF CHAR;
- pathname: ARRAY OF CHAR);
- VAR i: CARDINAL;
- BEGIN
- Str.Copy(currDir, pathname);
- i := Str.Length(currDir) - 1;
-
- WHILE currDir[i] # '\' DO
- currDir[i] := 0C;
- DEC(i)
- END;
- IF currDir[i-1] # ':' THEN
- currDir[i] := 0C
- END;
-
- AltFIO.ChDir(currDir)
- END ChangeDirectory;
-
- CONST ht = CHR(9);
-
- VAR pathname, currDir: AltFIO.PathName;
- D: FIO.DirEntry;
- found: BOOLEAN;
- drive: SHORTCARD;
-
- BEGIN
- DispPrgmID;
- IF Lib.ParamCount() # 1 THEN
- AltFIO.WrErr(ht+"Usage", " dirdel [drive][path]dirname")
- ELSE
- Lib.ParamStr( pathname, 1 );
- Str.Caps(pathname);
-
- IF (Str.Pos(pathname, "?") # MAX(CARDINAL)) OR
- (Str.Pos(pathname, "*") # MAX(CARDINAL)) THEN
- AltFIO.WrErr(pathname, "Wildcards not allowed");
- ELSE
- AltFIO.FormName(pathname, drive, currDir);
- found := AltFIO.ReadFirstEntry(pathname, FIO.FileAttr(Attr), D);
- IF ~found THEN
- AltFIO.WrErr(pathname, "Directory not found")
- ELSIF ~(Directory IN BITSET(D.attr)) THEN
- AltFIO.WrErr(pathname, "Not a directory")
- ELSE
- AltFIO.AddDrive(drive, currDir);
-
- IF Str.Pos(currDir, pathname) # MAX(CARDINAL) THEN
- ChangeDirectory(currDir, pathname)
- END;
-
- IF Confirm(pathname) THEN
- IO.WrLn;
- fileCount := 0; dirCount := 0;
- MakeEmpty( pathname );
-
- IF ReadOnly IN BITSET(D.attr) THEN
- AltFIO.SetAttr(pathname, FIO.FileAttr{}) (* clear attr *)
- END;
-
- AltFIO.RmDir(pathname);
- INC(dirCount);
- WrDelMsg(pathname);
- Report
- END
- END
- END
- END
- END DirDel.