home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* MV.PAS *)
- (* (c) 1989 Thomas Kellerer & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Move;
-
- USES Dos, Crt;
-
- VAR Error : Word;
-
- FUNCTION DError : Word;
- BEGIN
- DError := Error;
- Error := 0;
- END;
-
- PROCEDURE DeleteFile(s : STRING);
- VAR r : Registers;
- BEGIN
- s := s + #0;
- r.AH := $41;
- r.DS := Seg(s);
- r.DX := Ofs(s) + 1;
- MsDos(r);
- IF ((r.Flags AND FCarry) = FCarry) THEN Error := r.AX
- ELSE Error := 0;
- END;
-
- FUNCTION GetName(s : STRING) : STRING;
- (* Nur den Eigentlichen Namen extrahieren *)
- VAR k : BYTE;
- Name : STRING;
- BEGIN
- Name := '';
- k := Length(s);
- WHILE ((s[k]<>'\') AND (s[k]<>':') AND (k>0)) DO BEGIN
- Name := s[k] + Name;
- Dec(k);
- END;
- GetName := Name;
- END;
-
- FUNCTION GetPath(s : String) : String;
- (* Hole den Pfad der kompletten Angabe *)
- VAR k : BYTE;
- Pfad : STRING;
- BEGIN
- Pfad := '';
- k := Length(s);
- WHILE ((s[k]<>'\') AND (s[k]<>':') AND (k>0)) DO
- Dec(k);
- IF k = 0 THEN Pfad := ''
- ELSE
- IF k = 1 THEN Pfad := s[1]
- ELSE BEGIN
- Pfad := Copy(s, 1, k);
- IF (Pfad[Length(Pfad)] = '\') THEN BEGIN
- IF Pfad[Length(Pfad) - 1] <> ':' THEN
- Pfad:=Copy(Pfad,1,Length(Pfad)-1);
- END;
- END;
- GetPath:=Pfad;
- END;
-
- FUNCTION GetFullName(s : String) : String;
- VAR r : Registers;
- t : STRING;
- p : POINTER;
- AltP : POINTER;
- l : LongInt;
- BEGIN
- r.AH := $60;
-
- { undokumentierte DOS-Funktion: }
- { erweitert eine Namensangabe um aktuellen Pfad }
- { (falls nötig) expandiert evtl vorhandene '*' }
- { z.b.: aktuelles Verzeichnis: c:\turbo }
- { GetFullName('*.PAS') liefert C:\TURBO\????????.PAS' }
- { GetFullName('C:\DOS\COMMAND.COM') liefert das gleiche }
-
- s := s + #0;
- r.DS := Seg(s);
- r.SI := Ofs(s) + 1;
- { Vorsicht, auf Maxlänge wird nicht geprüft! }
- GetMem(p, 128);
- AltP := p; { Speicher anfordern }
- { DOS schreibt in diesen Puffer }
- r.ES := Seg(p^);
- r.DI := Ofs(p^);
- MsDos(r);
- t := '';
- l := LongInt(r.ES) * 16 + r.DI;
- p := Ptr(l DIV 16, l MOD 16);
- { Zeiger normalisieren: Offset ≤ 16 }
- { -> Offset inkrementieren ungefährlich!! }
- { (Kein Segmentsprung möglich bei max. 128 Byte) }
-
- WHILE Char(p^)<>#0 DO BEGIN { Puffer auslesen }
- t := t + Char(p^);
- p := Ptr(Seg(p^), Ofs(p^)+1); { 'entspricht' Inc(p^) }
- END;
- GetFullName := t;
- FreeMem(AltP, 128); { Speicher freigeben }
- END;
-
- FUNCTION GetAttrib(s : STRING) : BYTE;
- VAR r : Registers;
- BEGIN
- s := s + #0;
- r.DS := Seg(s);
- r.DX := Ofs(s) + 1;
- r.AH := $43;
- r.AL := 0;
- MsDos(r);
- IF (r.Flags AND FCarry) = FCarry THEN GetAttrib := $FF
- ELSE GetAttrib := r.CX;
- END;
-
- FUNCTION Wildcard(s : STRING) : BOOLEAN;
- BEGIN
- Wildcard := ((Pos('?', s) <> 0) OR (Pos('*', s) <> 0));
- END;
-
- PROCEDURE RenameFile(Alt, Neu : STRING);
- VAR Regs : Registers;
- BEGIN
- Alt := Alt + #0;
- Neu := Neu + #0;
- WITH Regs DO BEGIN
- AH := $56;
- DS := Seg(Alt);
- DX := Ofs(Alt) + 1;
- ES := Seg(Neu);
- DI := Ofs(Neu) + 1;
- MsDos(Regs);
- IF ((Flags AND FCarry) = FCarry) THEN Error := AX
- ELSE Error := 0;
- END;
- END;
-
- FUNCTION UpperCase(s : STRING) : STRING;
- VAR k : BYTE;
- BEGIN
- FOR k := 1 TO Length(s) DO s[k] := UpCase(s[k]);
- UpperCase := s;
- END;
-
- FUNCTION ParseNames(alt, neu : STRING) : STRING;
- VAR k, l : BYTE;
- s, t : STRING;
- p : BYTE;
- BEGIN
- k := Pos('.', Alt);
- IF k = 0 THEN t := Alt
- ELSE t := Copy(Alt, 1, k-1);
- WHILE Length(t) < 9 DO t := t + ' ';
- { auf acht zeichen erweitern }
- s := '';
- p := Pos('.', Neu);
- IF p = 0 THEN p := Length(Neu)
- ELSE Dec(p);
- FOR l := 1 TO p DO BEGIN { zuerst den Namen behandeln }
- IF Neu[l] = '?' THEN s := s + t[l]
- ELSE s := s + neu[l];
- END;
- l := Length(s);
- WHILE s[l] = ' ' DO BEGIN
- Delete(s, l, 1);
- Dec(l);
- END; { Leerzeichen löschen }
- { Extensiomn behandeln }
- IF k = 0 THEN t := '. '
- ELSE t := Copy(Alt, k, Length(Alt) - k + 1);
- WHILE Length(t) < 4 DO t := t + ' '; { auffüllen }
- IF Pos('.', Neu) = 0 THEN Neu := Neu + '. ';
- FOR l := 1 TO 4 DO BEGIN
- IF Neu[p+l] = '?' THEN s := s + t[l]
- ELSE s := s + neu[p+l];
- END;
- ParseNames := s;
- END;
-
- PROCEDURE Abbruch(Fehler : Word);
- BEGIN
- CASE Fehler OF
- 2 : WriteLn('Datei nicht gefunden');
- 3 : WriteLn('Pfad nicht gefunden');
- 5 : WriteLn('Zugriff verweigert');
- 11 : WriteLn('Quell/Ziellaufwerk nicht identisch');
- ELSE
- WriteLn('Fehler: ', Fehler);
- END;
- Halt(3);
- END;
-
- VAR DirInfo : SearchRec;
- Fehler : WORD;
- AltName, NeuName, Alt, Neu : STRING;
- ch : Char;
- OverWrite : BOOLEAN;
-
- BEGIN
- Error := 0;
- Overwrite := TRUE;
- IF ParamCount <> 2 THEN BEGIN
- WriteLn('mv - Verschiebt oder benennt Dateien um');
- WriteLn;
- WriteLn('Aufruf mit: mv AlterName NeuerName');
- WriteLn(' Gebrauch wie rename');
- WriteLn(' z.B.: mv *.BAT *.BAK');
- WriteLn(' mv \bat\*.bat \bin\*.*');
- WriteLn;
- WriteLn('Auch Verzeichnisse können umbenannt werden');
- Halt(2);
- END;
- AltName := GetFullName(ParamStr(1));
- NeuName := ParamStr(2);
- IF (GetAttrib(NeuName) = Directory) THEN
- NeuName := NeuName + '\*.*';
- IF NeuName[Length(NeuName)] = '\' THEN
- NeuName := NeuName + '*.*';
- NeuName := GetFullName(NeuName);
- FindFirst(AltName, AnyFile, DirInfo);
- WHILE DOSError = 0 DO BEGIN
- Alt := GetPath(AltName);
- IF Alt[Length(alt)] <> '\' THEN
- Alt := Alt + '\' + DirInfo.Name
- ELSE
- Alt := Alt + DirInfo.Name;
- Neu := GetPath(NeuName);
- IF Neu[Length(Neu)] <> '\' THEN
- Neu:=Neu+'\'+ParseNames(DirInfo.Name,GetName(NeuName))
- ELSE
- Neu:=Neu+ParseNames(DirInfo.Name,GetName(NeuName));
- IF GetAttrib(Neu) <> 255 THEN BEGIN
- { Ziel existiert schon }
- Write('Zieldatei: ', Neu, ' überschreiben? (J/N)');
- REPEAT
- ch := UpCase(ReadKey);
- UNTIL ch IN ['J', 'N'];
- Write(#13);
- ClrEOL;
- IF ch = 'J' THEN BEGIN
- Overwrite := TRUE;
- DeleteFile(Neu);
- END ELSE
- Overwrite := FALSE;
- END;
- IF Overwrite THEN BEGIN
- WriteLn('Verschiebe: ', Alt, ' nach: ', Neu);
- RenameFile(Alt, Neu);
- END ELSE
- WriteLn('Datei ', alt, ' nicht verschoben!');
- Overwrite := TRUE;
- Fehler := DError;
- IF Fehler <> 0 THEN Abbruch(Fehler);
- FindNext(DirInfo);
- END;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von MV.PAS *)