続き。
>>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;