home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* 1DCOPY.PAS *)
- (* (c) 1990 Bernd Heukendorf & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM One_Drive_Copy_120;
- {$I-}
- {$V-}
- USES Crt, Dos;
-
- TYPE
- DirPtr = ^DateiPtr;
- PufferPtr = ^POINTER;
- Str6 = STRING [6];
- DateiPtr = RECORD
- Size : LONGINT;
- Name : STRING [12]
- END;
-
- VAR
- FehlerStr : ARRAY [1..5] OF STRING[31];
- Puffer : ARRAY [1..255, 1..10] OF PufferPtr;
- Datei : ARRAY [1..255] OF DirPtr;
- BlockSize : ARRAY [1..255,1..10] OF LONGINT;
- Kopiert : ARRAY [1..255] OF BYTE;
- F : SearchRec;
- Regs : Registers;
- FileIO : FILE;
- Ch : CHAR;
- Rest, MaxMem : LONGINT;
- Result : WORD;
- YPos, I, K,
- DateiAnzahl,
- Geladen,
- Gespeichert : BYTE;
-
- PROCEDURE Fehler(FehlerCode : BYTE);
- BEGIN
- GotoXY(1, YPos + 4);
- WriteLn('Fehler - ', FehlerStr[FehlerCode]);
- IF FehlerCode = 4 THEN BEGIN
- Close(FileIO);
- Erase(FileIO)
- END;
- Halt(FehlerCode);
- END;
-
- PROCEDURE Init;
- BEGIN
- WriteLn;
- WriteLn('1DriveCopy 1.2');
- WriteLn;
- WriteLn('File(s) gefunden :');
- WriteLn('File(s) geladen :');
- WriteLn('File(s) kopiert :');
- WriteLn;
- FehlerStr [1] := 'kein Dateiname angegeben';
- FehlerStr [2] := 'Datei(en) nicht gefunden';
- FehlerStr [3] := 'Datenträger nicht auswechselbar';
- FehlerStr [4] := 'Disk voll';
- FehlerStr [5] := 'nicht genug Speicher';
- DateiAnzahl := 0;
- MaxMem := MemAvail;
- YPos := WhereY - 4;
- If ParamCount = 0 Then Fehler(1);
- Regs.AH := $44;
- Regs.AL := 8;
- Regs.BL := 0;
- MSDos(Regs);
- IF Regs.AX = 1 THEN Fehler(3);
- END;
-
- PROCEDURE Wechsel(Txt : Str6);
- BEGIN
- WHILE KeyPressed DO Ch := ReadKey;
- GotoXY(30, YPos);
- Write('╔══════════════════════╗');
- GotoXY(30,YPos + 1);
- Write('║ ', Txt, '-Disk einlegen ║');
- GotoXY(30,YPos + 2);
- Write('╚══════════════════════╝');
- Write(#7);
- Ch := ReadKey;
- FOR K := 0 TO 2 DO BEGIN
- GotoXY(30, YPos + K);
- ClrEol;
- END;
- END;
-
- PROCEDURE Suchen;
- BEGIN
- FOR i := 1 TO ParamCount DO BEGIN
- FindFirst(ParamStr(i),
- AnyFile - Directory - VolumeID,F);
- WHILE DosError = 0 DO BEGIN
- IF F.Size > (MaxMem - Length(F.Name) - 5) THEN
- Fehler(5);
- Inc(DateiAnzahl);
- Kopiert[DateiAnzahl] := 0;
- GotoXY(20, YPos);
- Write(DateiAnzahl : 3);
- GetMem(Datei[DateiAnzahl], Length(F.Name) + 5);
- Move(F.Size, Datei[DateiAnzahl]^,
- Length(F.Name) + 5);
- FindNext(F);
- END;
- END;
- IF DateiAnzahl = 0 THEN Fehler(2);
- END;
-
- PROCEDURE Kopieren;
- BEGIN
- Suchen;
- Geladen := 0;
- Gespeichert := 0;
- REPEAT
- IF Geladen > 0 THEN Wechsel('Source');
- FOR i := 1 TO DateiAnzahl DO
- IF (Kopiert[i] = 0) AND
- (Datei[i]^.Size <= MemAvail) THEN BEGIN
- Kopiert[i] := 1;
- Inc(Geladen);
- Assign(FileIO, Datei[I]^.Name);
- Reset(FileIO, 1);
- Rest := Datei[i]^.Size;
- K := 0;
- REPEAT
- Inc(K);
- BlockSize[i,K] := Rest;
- IF BlockSize[i, K] > 65522 THEN
- BlockSize[i, K] := 65522;
- IF BlockSize[i, K] > MaxAvail THEN
- BlockSize[i, K] := MaxAvail;
- GetMem(Puffer[i, K], BlockSize[i, K]);
- BlockRead(FileIO, Puffer[i,K]^, BlockSize[i,K]);
- Dec(Rest, BlockSize[i,K]);
- UNTIL Rest = 0;
- Close(FileIO);
- GotoXY(20, YPos + 1);
- Write(Geladen : 3);
- END;
- Wechsel('Target');
- FOR i := 1 TO DateiAnzahl DO
- IF Kopiert[i] = 1 THEN BEGIN
- Kopiert[i] := 2;
- Inc(Gespeichert);
- Assign(FileIO, Datei[i]^.Name);
- Rewrite(FileIO, 1);
- Rest := Datei[i]^.Size;
- K := 0;
- REPEAT
- Inc(K);
- BlockWrite(FileIO, Puffer[i, K]^,
- BlockSize[i,K], Result);
- FreeMem(Puffer[i, K], BlockSize[i, K]);
- IF Result <> BlockSize[i, K] THEN Fehler(4);
- Dec(Rest, BlockSize[i, K]);
- UNTIL Rest = 0;
- Close(FileIO);
- FreeMem(Datei[i], Length(Datei[i]^.Name) + 5);
- GotoXY(20, YPos + 2);
- WRITE(Gespeichert : 3);
- END;
- UNTIL Gespeichert = DateiAnzahl;
- WriteLn
- END;
-
- BEGIN
- Init;
- Kopieren;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von 1DCOPY.PAS *)