home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* CLEAR.PAS *)
- (* Löschen und Überschreiben von Dateien *)
- (* (c) 1989 Andreas Kleine & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Clear;
-
- USES Dos, Crt;
-
- CONST bufs = $E000; { Max. 57344 Bytes werden }
- { auf einmal überschrieben }
- VAR handl, written,
- count : WORD;
- pfad, fname, s : STRING;
- sr : SearchRec;
- ch : CHAR;
- del : BOOLEAN; { Abfrage löschen }
- buffer : ARRAY [1..bufs] OF BYTE;
-
- PROCEDURE OpenFile(fname : STRING; access : WORD;
- VAR handl : WORD);
- VAR r : Registers;
- BEGIN
- r.ax := $3d00 + access; fname := fname + #0;
- r.ds := Seg(fname); r.dx := Ofs(fname) + 1;
- MsDos(r);
- IF Odd(r.flags) THEN BEGIN { Carry gesetzt? }
- Writeln('Datei kann nicht geöffnet werden');
- Halt;
- END ELSE handl := r.ax;
- END;
-
- PROCEDURE CloseFile(handl : INTEGER);
- VAR r: REGISTERS;
- BEGIN
- r.ax := $3e00; { DOS Funk. 62, Datei schließen }
- r.bx := handl;
- MsDos(r);
- IF Odd(r.flags) THEN BEGIN
- WriteLn('Fehler beim Schließen der Datei');
- Halt;
- END;
- END;
-
- PROCEDURE WriteBuffer(handl, anzbytes : WORD;
- VAR transf: WORD);
- { Schreibt anzbytes u. übergibt die tat- }
- { sächlich geschriebenen Bytes (transf) }
- VAR r: Registers;
- BEGIN
- r.bx := handl;
- r.ax := $4000; { DOS Funk. 67,Datei beschreiben }
- r.cx := anzbytes;
- r.ds := Seg(buffer); r.dx := Ofs(buffer);
- MsDos(r);
- IF Odd(r.flags) THEN BEGIN
- Writeln(' Datei-Schreibfehler aufgetreten');
- Halt;
- END ELSE transf := r.ax;
- IF transf <> anzbytes THEN BEGIN
- Writeln(' Achtung!! Es konnten nicht alle ',
- 'Bytes der Datei überschrieben werden!');
- Halt;
- END;
- END;
-
- PROCEDURE ClearFile;
- { schreibt leeren Buffer in die Datei }
- VAR rest, anz, time : LONGINT;
- f : FILE;
- BEGIN
- Assign(f, pfad + sr.name);
- Reset(f, 1); { Durch "1" ermittelt FileSize }
- rest := FileSize(f); { die Größe in Bytes }
- IF NOT del THEN GetFTime(f, time);
- OpenFile(pfad + sr.name, 1, handl);
- REPEAT
- IF rest > bufs THEN anz := bufs
- ELSE anz := rest;
- WriteBuffer(handl, anz , written);
- Dec(rest, written);
- UNTIL rest = 0;
- Closefile(handl);
- IF NOT del THEN SetFTime(f, time)
- ELSE erase(f);
- close(f);
- Inc(count);
- END;
-
- PROCEDURE Parse(param : STRING; VAR pfad, fname : STRING);
- { teilt Parameter in Pfad und Datei auf }
- VAR i : BYTE;
- BEGIN
- i := Length(param);
- WHILE NOT(param[i] IN ['\', ':']) AND (i > 0) DO Dec(i);
- pfad := Copy(param, 1, i);
- IF i < Length(param) THEN
- fname := Copy(param, i+1, Length(param))
- ELSE fname := '*.*';
- END;
-
- BEGIN
- ClrScr; WriteLn;
- WriteLn(' CLEAR überschreibt und löscht Dateien');
- Write(' ( Sie sind auch mit Undelete, Recover',
- ' usw. nicht mehr zurück zugewinnen! )');
- WriteLn; WriteLn;
- IF (ParamCount = 0) OR (ParamCount > 2) THEN BEGIN
- Writeln(' Aufruf: CLEAR [Pfad][Datei] [-]');
- Writeln(' - : Dateien werden überschrieben,',
- ' aber nicht gelöscht');
- Halt;
- END;
- FillChar(buffer, bufs, $F6); { Buffer füllen }
- del := ParamStr(2) <> '-';
- IF del THEN s := ' und gelöscht' ELSE s := '';
- Parse(Paramstr(1), pfad, fname);
- IF pfad = '' THEN BEGIN
- GetDir(0, pfad); { akt. Dir. }
- IF pfad[Length(pfad)] <> '\' THEN pfad := pfad + '\';
- END;
- WriteLn(' Pfad: ', pfad, ' Datei: ', fname);
- WriteLn(' Es wird überschrieben' + s); WriteLn;
- count := 0;
- FindFirst(pfad + fname, anyfile, sr);
- IF DosError IN [2, 18] THEN
- WriteLn(' Datei nicht gefunden!');
- WHILE DosError = 0 DO BEGIN
- IF sr.attr AND ReadOnly <> 0 THEN
- WriteLn(' ', sr.name, ' ist schreibgeschützt',
- ' - Zugriff ist nicht möglich!')
- ELSE
- IF (sr.attr AND directory = 0) AND
- (sr.attr AND volumeID= 0) THEN BEGIN
- Write(' Soll ', sr.name:12, ' überschrieben',
- s + ' werden (J/N/ESC) ? ');
- REPEAT
- ch := UpCase(ReadKey);
- UNTIL ch IN ['J', 'N', #27];
- IF ch = #27 THEN Halt;
- WriteLn(ch); IF ch = 'J' THEN ClearFile;
- END;
- FindNext(sr); { Nächste Datei suchen }
- END;
- IF DosError = 3 THEN WriteLn(' Pfad nicht gefunden!');
- WriteLn;
- WriteLn(count:3, ' Datei(en) überschrieben' + s);
- END.
- (* ------------------------------------------------------ *)
- (* Ende von CLEAR.PAS *)