http://perso.magic.fr/sleon/prog/libbzip2/Man/HowUse1.htmProcedure CompressFile (Src, Dest : String); Const BUFF = $4000; Var CStream : TCompressStream; InStream : TFileStream; OutStream : TFileStream; x : Integer; Buf : array[0..BUFF] of Byte; Begin OutStream := nil; InStream := nil; CStream := nil; Try // Process 1.0 : Create the CompressionStream. InStream := TFileStream.Create( Src, fmOpenRead OR fmShareDenyNone ); OutStream := TFileStream.Create( Dest, fmCreate OR fmShareDenyWrite ); CStream := TCompressStream.Create(clBetter, OutStream, InStream.Size, Form1.OnProgress); // Process 1.1 : Compress the file with libbzip2. For x := 1 To (InStream.Size div BUFF) Do Begin InStream.ReadBuffer(Buf, BUFF); // IN ---- CStream.Write (Buf, BUFF); // OUT <---/ End; x := InStream.Size MOD BUFF; If (x>0) Then Begin InStream.ReadBuffer(Buf, x); // IN ---- CStream.Write (Buf, x); // OUT <---/ End; // Process 1.2 : Close the streams. CStream.Free ; CStream := nil; OutStream.Free; OutStream := nil; InStream.Free ; InStream := nil; Except on n : Exception Do Begin If ( CStream <> nil) Then CStream.Free; // Clean exit If (OutStream <> nil) Then OutStream.Free; If ( InStream <> nil) Then InStream.Free; If (n is Ebz2DATAError) Then MessageDlg(n.Message, mtError,[mbOk], 0) Else If (n is Ebz2MEMError) Then MessageDlg(n.Message, mtError,[mbOk], 0) Else If (n is Ebz2USERError) Then MessageDlg(n.Message, mtWarning,[mbOk], 0) Else MessageDlg('Internal Error', mtError,[mbOk], 0); End; End; End;
Const
BUFF = $4000;
Var
CStream : TCompressStream;
InStream : TFileStream;
OutStream : TFileStream;
x : Integer;
Buf : array[0..BUFF] of Byte;
Begin
OutStream := nil;
InStream := nil;
CStream := nil;
Try
// Process 1.0 : Create the CompressionStream.
InStream := TFileStream.Create( Src, fmOpenRead OR fmShareDenyNone );
OutStream := TFileStream.Create( Dest, fmCreate OR fmShareDenyWrite );
CStream := TCompressStream.Create(clBetter, OutStream, InStream.Size, Form1.OnProgress);
// Process 1.1 : Compress the file with libbzip2.
For x := 1 To (InStream.Size div BUFF) Do Begin
InStream.ReadBuffer(Buf, BUFF); // IN ---- CStream.Write (Buf, BUFF); // OUT <---/
End;
x := InStream.Size MOD BUFF;
If (x>0) Then Begin
InStream.ReadBuffer(Buf, x); // IN ---- CStream.Write (Buf, x); // OUT <---/
End;
// Process 1.2 : Close the streams.
CStream.Free ; CStream := nil;
OutStream.Free; OutStream := nil;
InStream.Free ; InStream := nil;
Except
on n : Exception Do Begin
If ( CStream <> nil) Then CStream.Free; // Clean exit
If (OutStream <> nil) Then OutStream.Free;
If ( InStream <> nil) Then InStream.Free;
If (n is Ebz2DATAError) Then MessageDlg(n.Message, mtError,[mbOk], 0)
Else If (n is Ebz2MEMError) Then MessageDlg(n.Message, mtError,[mbOk], 0)
Else If (n is Ebz2USERError) Then MessageDlg(n.Message, mtWarning,[mbOk], 0)
Else MessageDlg('Internal Error', mtError,[mbOk], 0);
End;
End;
End;
write(buffer);