( ゚Д゚)ノ Delギコ猫のプログラミング相談室part2

このエントリーをはてなブックマークに追加
119104
続き。>>103 で結合したファイルを分離。

{ MakeArchive関数で結合されたアーカイブ Filename を分離し
DestPath ディレクトリ内に保存する ファイル名は 256 バイトまででそれ以上は切り捨て
上書き確認はしない}

procedure SeparateArchive(const Filename, DestPath:string);
var
 Filesize:Int64;
 i:integer;
 Source:TMemoryStream;
 Dest:TMemoryStream;
 Buf:array [0..256-1] of Char;
 SizeBuf:array [0..16-1] of Byte;
 Name:string;
begin
 Source:=TMemoryStream.Create;
 Dest := TMemoryStream.Create;
 try
  Source.LoadFromFile( Filename );

  repeat
   {ヘッダ:最初の256バイトをGET}
   Source.ReadBuffer( Buf, 256 );
   Name := Buf;

   {ヘッダ:次の16バイトをGET}
   Source.ReadBuffer( SizeBuf, 16 );
   Filesize:=0;
   for i:=0 to 16-1 do
    Inc( Filesize, SizeBuf[i] shl (i*8) );

   {ファイルを抽出}
   Dest.Clear;
   Dest.CopyFrom( Source, Filesize );

   {保存}
   Dest.SaveToFile( IncludeTrailingPathDelimiter(DestPath) + Name );
  until Source.Position >= Source.Size;
 finally
  Source.Free;
  Dest.Free;
 end;
end;