home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* XERA.PAS *)
- (* (c) 1990 Günter Rau & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM CrossErase;
-
- {$R-,S-,I-,V-,B-,N-}
- {$M 50000,0,0}
-
- USES Crt,Dos;
-
- TYPE
- str10 = STRING [10];
-
- CONST
- Version = 'X(Cross)ERA(se)';
- DelayTime = 2000;
- BufLen = 1024;
- JokerChar : STRING = '&';
- { Joker für ein beliebiges Zeichen }
- JokerStr : STRING = '*';
- { Joker für beliebige Zeichenkette }
- OptionCut : STRING = '/';
- { durch dieses Zeichen werden Optionen getrennt }
- ExcludeName : STRING = '?????????.????';
- forced : BOOLEAN = FALSE;
- subdir : BOOLEAN = FALSE;
- cat : BOOLEAN = FALSE;
- request : BOOLEAN = FALSE;
- slow : BOOLEAN = FALSE;
- wipe : BOOLEAN = FALSE;
-
- VAR
- Path : DirStr;
- FName : NameStr;
- FExt : ExtStr;
- Buffer : ARRAY [1..BufLen] OF BYTE;
-
- PROCEDURE Help;
- BEGIN
- WriteLn;
- WriteLn('Folgende Optionen sind erlaubt:');
- WriteLn('/DIR löschen eines Unterverzeichnisses');
- WriteLn('/SUB Dateien werden auch in allen ',
- 'Unterverzeichnissen gelöscht');
- WriteLn('/F auch Dateien mit den Attributen ',
- 'Hidden und ReadOnly werden gelöscht');
- WriteLn('/SL langsames Löschen');
- WriteLn('/WIPE Datei wird überschrieben, bevor ',
- 'sie gelöscht wird');
- WriteLn('/R bei jeder Datei wird gefragt, ',
- 'ob sie gelöscht werden soll');
- WriteLn('/EX=file diese Dateien werden nicht ',
- 'gelöscht');
- WriteLn;
- WriteLn('Beispiel:');
- WriteLn('DELETE *.*/SUB/WIPE/EX=*.pas');
- WriteLn;
- END;
-
- PROCEDURE ExitProcedure;
- VAR
- c : CHAR;
- BEGIN
- IF KeyPressed THEN BEGIN
- c := ReadKey;
- IF c = #27 THEN Halt(0);
- WriteLn('Press any key to continue, or ESC to Exit');
- c := ReadKey;
- IF c = #27 THEN Halt(0);
- END;
- END;
-
- FUNCTION StrUpCase(s : STRING) : STRING;
- VAR
- i : INTEGER;
- BEGIN
- FOR i := 1 TO Length(s) DO s[i] := UpCase(s[i]);
- StrUpCase := s;
- END;
-
- FUNCTION FileAttr(sr : SearchRec; Attr : BYTE) : BOOLEAN;
- BEGIN
- FileAttr := FALSE;
- IF (sr.Attr AND Attr) = Attr THEN FileAttr := TRUE;
- END;
-
- FUNCTION MinInt(a, b : INTEGER) : INTEGER;
- BEGIN
- IF a < b THEN MinInt := a
- ELSE MinInt := b;
- END;
-
- FUNCTION Jokerposition(s : STRING) : INTEGER;
- { gibt an, an welcher Stelle in "s" ein Joker vorkommt }
- VAR
- Starpos, Andpos : INTEGER;
- BEGIN
- Starpos := Pos(Jokerstr, s);
- Andpos := Pos(Jokerchar, s);
- IF Starpos = 0 THEN Jokerposition := Andpos;
- IF Andpos = 0 THEN Jokerposition := Starpos;
- IF (Starpos > 0) AND (Andpos > 0) THEN
- Jokerposition := MinInt(Starpos, Andpos);
- END;
-
- FUNCTION Match(Jokerstring, name : STRING) : BOOLEAN;
- { prüft, ob Jokerstring und name 'zusammenpassen' }
- VAR
- Matchpos, Jokerpos, NextJokerpos, Starpos,
- Andpos, NameLen, JokerStringLen : INTEGER;
- BEGIN
- NameLen := Length(name);
- Jokerstringlen := Length(Jokerstring);
- Jokerpos := Jokerposition(Jokerstring);
- IF Jokerpos > 1 THEN BEGIN
- IF Copy(Jokerstring, 1, Jokerpos-1) =
- Copy(name, 1, Jokerpos-1) THEN BEGIN
- Match := Match(Copy(Jokerstring, Jokerpos,
- Jokerstringlen),
- Copy(name, Jokerpos, namelen));
- END ELSE BEGIN
- Match := FALSE;
- END;
- END;
- IF Jokerpos = 1 THEN BEGIN
- nextJokerpos := Jokerposition(Copy(Jokerstring, 2,
- Jokerstringlen-1));
- IF Copy(Jokerstring, 1, 1) = Jokerstr THEN BEGIN
- { Joker = '*' }
- IF nextJokerpos = 0 THEN BEGIN
- Match := Match(Copy(Jokerstring, 2,
- Jokerstringlen-1),
- Copy(name, namelen -
- (Jokerstringlen-1)+1,
- Jokerstringlen-1));
- END ELSE BEGIN
- matchpos := Pos(Copy(Jokerstring, 2,
- nextJokerpos-1), name);
- IF matchpos = 0 THEN BEGIN
- Match := FALSE;
- END ELSE BEGIN
- Match := Match(Copy(Jokerstring, 2,
- Jokerstringlen-1),
- Copy(name, matchpos,
- namelen-matchpos+1));
- END;
- END;
- END ELSE BEGIN { Joker = '&' }
- IF namelen > 0 THEN BEGIN
- Match := Match(Copy(Jokerstring, 2,
- Jokerstringlen-1),
- Copy(name, 2, namelen-1));
- END ELSE BEGIN
- Match := FALSE;
- END;
- END;
- END;
- IF Jokerpos = 0 THEN BEGIN
- Match := (Jokerstring = name);
- END;
- END;
-
- PROCEDURE ParseInput;
- VAR
- Position : INTEGER;
- option, name : STRING;
-
- PROCEDURE ParseOption(option : STRING);
- BEGIN
- IF Length(option) > 0 THEN BEGIN
- option := option + '/';
- option := StrUpCase(option);
- IF Pos('/HELP/', option) > 0 THEN BEGIN
- help;
- Halt(0);
- END;
- IF Pos('/EX=', option) > 0 THEN BEGIN
- Excludename := option;
- Delete(ExcludeName, 1,
- Pos('/EX=', ExcludeName) + 3);
- excludename := Copy(excludename, 1,
- Pos('/', excludename)-1);
- END;
- IF Pos('/SUB/', option) > 0 THEN subdir := TRUE;
- IF Pos('/F/', option) > 0 THEN forced := TRUE;
- IF Pos('/DIR/', option) > 0 THEN cat := TRUE;
- IF Pos('/R/', option) > 0 THEN request := TRUE;
- IF Pos('/SL/', option) > 0 THEN slow := TRUE;
- IF Pos('/WIPE/', option) > 0 THEN wipe := TRUE;
- END;
- END;
-
- BEGIN
- name := '';
- option := '';
- IF ParamCount = 1 THEN BEGIN
- Position := Pos(optioncut, ParamStr(1));
- IF Position > 0 THEN BEGIN
- option := Copy(ParamStr(1), Position,
- Length(ParamStr(1)));
- name := Copy(ParamStr(1), 1, Position-1);
- END ELSE BEGIN
- name := ParamStr(1);
- END;
- END ELSE Halt(0);
- name := FExpand(name);
- FSplit(name, Path, FName, FExt);
- ParseOption(option);
- END;
-
- PROCEDURE WipeFile(VAR f : FILE);
- VAR
- i, len : LONGINT;
- BEGIN
- Rewrite(f, BufLen);
- len := (FileSize(f) DIV BufLen) + 1;
- FOR i := 1 TO len DO BEGIN
- BlockWrite(f, Buffer, 1);
- END;
- Close(f);
- END;
-
- PROCEDURE DeleteFiles(Path, FName : STRING);
-
- PROCEDURE DelFile(Path,FName : STRING);
- VAR
- sr : SearchRec;
- f : FILE;
- c : CHAR;
- BEGIN
- FindFirst(Path + '*.*', anyfile, sr);
- WHILE DosError = 0 DO BEGIN
- IF NOT (FileAttr(sr, Directory) OR
- FileAttr(sr, volumeid)) THEN BEGIN
- IF Match(FName, sr.name) AND
- (NOT Match(excludename, sr.name)) THEN BEGIN
- Assign(f, Path + sr.name);
- IF forced AND
- (NOT FileAttr(sr, SysFile)) THEN BEGIN
- SetFAttr(f, 0);
- sr.Attr := 0;
- END;
- IF FileAttr(sr, ReadOnly) OR
- FileAttr(sr, Hidden) OR
- FileAttr(sr, SysFile) THEN BEGIN
- Write(Path + sr.name);
- GotoXY(65, WhereY);
- WriteLn('NOT deleted');
- END ELSE BEGIN
- ExitProcedure;
- IF request THEN BEGIN
- Write(Path + sr.name);
- GotoXY(60, WhereY);
- Write('delete ? (Y/N) ');
- c := ReadKey;
- IF c = #27 THEN Halt(0);
- WriteLn(UpCase(c));
- IF UpCase(c) = 'Y' THEN BEGIN
- IF wipe THEN WipeFile(f);
- Erase(f);
- END;
- END ELSE BEGIN
- IF slow THEN Delay(delaytime);
- ExitProcedure;
- IF wipe THEN WipeFile(f);
- Erase(f);
- Write(Path + sr.name);
- GotoXY(65, WhereY);
- WriteLn('deleted');
- END;
- END;
- END;
- END;
- FindNext(sr);
- END;
- END;
-
- PROCEDURE DelAllFiles(Path, FName : STRING);
- VAR
- sr : SearchRec;
- BEGIN
- DelFile(Path,FName);
- FindFirst(Path + '*.*', anyfile, sr);
- WHILE DosError = 0 DO BEGIN
- IF FileAttr(sr, Directory) AND
- (sr.name[1] <> '.') THEN
- DelAllFiles(Path + sr.name + '\', FName);
- FindNext(sr);
- END;
- END;
-
- PROCEDURE DelDir(Path : STRING);
- VAR
- sr : SearchRec;
- s : STRING;
- BEGIN
- DelFile(Path, '*');
- FindFirst(Path + '*.*', anyfile, sr);
- WHILE DosError = 0 DO BEGIN
- IF FileAttr(sr, Directory) AND
- (sr.name[1] <> '.') THEN
- DelDir(Path + sr.name + '\');
- FindNext(sr);
- END;
- s := Path;
- Delete(s, Length(s), 1);
- {$I-}
- RmDir(s);
- {$I+}
- Write('Directory ', Path, ' ');
- IF IOResult <> 0 THEN
- WriteLn('cannot be removed')
- ELSE
- WriteLn('removed')
- END;
-
- BEGIN
- IF subdir THEN BEGIN
- DelAllFiles(Path, FName); Exit;
- END;
- IF cat THEN BEGIN
- DelDir(Path + FName+'\'); Exit;
- END;
- DelFile(Path, FName);
- END;
-
- BEGIN
- FillChar(Buffer, BufLen, #0);
- ParseInput;
- DeleteFiles(Path, FName + FExt);
- END.
- (* ------------------------------------------------------ *)
- (* Ende von XERA.PAS *)