[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]

{
MICHAEL REECE

> Hi!  I was wondering.  How would you in Turbo Pascal be able to split a
> single File into two.  I want it to split it to a precise Byte For both
> Files. I want to be able to combine to Files together and split it to its
> original sizes and still be able to work (that no codes are missing etc.).

The following is kludgy and only semi tested, but may help you get started.
It's an old little thing I wrote to split large Files to put on a floppy, and
then put it back together again.
}

(* usage:  split <Filename> <new-name-for-second-half>
   ex: split nodelist.zip nodelist.zi2
*)
Program Split;

Const
  MaxBuffSize = 61140;

Type
  BuffType = Array[1..MaxBuffSize] of Byte;

Var
  F1, F2   : File;
  Mid      : LongInt;
  Buffer   : ^BuffType;
  BuffSize : LongInt;
  NumRead,
  NumWrite : Word;

begin
  Writeln('Splitting File "', ParamStr(1), '"');
  Assign(F1, ParamStr(1));
  Reset(F1, 1);
  Mid:=FileSize(F1) div 2;                     { calculate midpoint }
  Writeln('  Original size: ', FileSize(F1));
  Writeln('  File midpoint: ', Mid);
  Writeln('Creating File "', ParamStr(2), '"');
  Assign(F2, ParamStr(2));
  ReWrite(F2, 1);
  Writeln('Memory available: ', MaxAvail);    { allocate max buffer }
  BuffSize:=MaxAvail;
  if (BuffSize > MaxBuffSize) then
    BuffSize:=MaxBuffSize;
  GetMem(Buffer, BuffSize);
  Writeln('  Buffer size: ', BuffSize);
  Writeln('Seeking to midpoint');
  Seek(F1, Mid);
  Writeln('  Copying remainder of File');
  While (not Eof(F1)) do
  begin
    BlockRead(F1, Buffer^, BuffSize, NumRead);
    BlockWrite(F2, Buffer^, NumRead, NumWrite);
    if (NumRead <> NumWrite) then
    begin
      Writeln('Error in copy');
      Halt(1);
    end;
  end;
  Writeln('Seeking to midpoint');
  Seek(F1, Mid);
  Writeln('  Truncating File');
  Truncate(F1);
  Writeln('Closing Files');
  Close(F2);
  Close(F1);
  Writeln('Done.');
end.

{ That one splits a File in half. }

(* usage:  splice <Filename> <name-of-second-half>
   ex: split nodelist.zip nodelist.zi2
   this will append/splice nodelist.zi1 to nodelist.zip
*)
Program Splice;

Const
  MaxBuffSize = 61140;

Type
  BuffType = Array[1..MaxBuffSize] of Byte;

Var
  F1, F2   : File;
  Buffer   : ^BuffType;
  BuffSize : LongInt;
  NumRead,
  NumWrite : Word;

begin
  Writeln('Splicing File "', ParamStr(1), '"');
  Assign(F1, ParamStr(1));
  Reset(F1, 1);
  Writeln('  Original size: ', FileSize(F1));
  Writeln('Appending File "', ParamStr(2), '"');
  Assign(F2, ParamStr(2));
  Reset(F2, 1);
  Writeln('  Original size: ', FileSize(F1));
  Writeln('Memory available: ', MaxAvail);    { allocate max buffer }
  BuffSize:=MaxAvail;
  if (BuffSize > MaxBuffSize) then
    BuffSize:=MaxBuffSize;
  GetMem(Buffer, BuffSize);
  Writeln('  Buffer size: ', BuffSize);
  Writeln('Seeking to end');
  Seek(F1, FileSize(F1));
  Writeln('  Copying File');
  While (not Eof(F2)) do
  begin
    BlockRead(F2, Buffer^, BuffSize, NumRead);
    BlockWrite(F1, Buffer^, NumRead, NumWrite);
    if (NumRead <> NumWrite) then
    begin
      Writeln('Error in copy');
      Halt(1);
    end;
  end;
  Writeln('Closing Files');
  Writeln('Done.');
  Close(F2);
  Close(F1);
end.


[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]