unituCompress;
![](/icons/45469int.gif)
uses
Windows,Messages,SysUtils,Variants,Classes,ComCtrls,Dialogs;
//压缩/解压文件
procedureCompressFile(Source,Target:String);stdcall;
procedureDecompressFile(Source,Target:String);stdcall;
//压缩/解压文件到流
procedureCompressToStream(FileName:String;Stream:TStream);stdcall;
procedureDecompressToStream(FileName:String;Stream:TStream);stdcall;
//压缩/解压流
procedureCompressStream(InStream,OutStream:TStream);stdcall;
procedureDecompressStream(InStream,OutStream:TStream);stdcall;
implementation
uses
ZLib;
const
COMPRESS_ERROR=’压缩文件时出现内部
![](/icons/45469cuowu.gif)
DECOMPRESS_ERROR=’解压文件时出现内部
![](/icons/45469cuowu.gif)
COMPRESS_STRM_ERROR=’压缩流时出现内部
![](/icons/45469cuowu.gif)
DECOMPRESS_STRM_ERROR=’解压流时出现内部
![](/icons/45469cuowu.gif)
BufSize=$4096;
//压缩文件
procedureCompressFile(Source,Target:String);
var
i:Integer;
Buf:
![](/icons/45469byte.gif)
ComStream:TCompressionStream;
InStream,OutStream:TFileStream;
begin
![](/icons/45469if.gif)
Exit;
InStream:=Nil;
OutStream:=nil;
ComStream:=nil;
try
//生成流
InStream:=TFileStream.Create(Source,fmOpenReadORfmShareDenyNone);
OutStream:=TFileStream.Create(Target,fmCreateORfmShareDenyWrite);
ComStream:=TCompressionStream.Create(clMax,OutStream);
//压缩流
fori:=1to(InStream.SizedivBufSize)dobegin
InStream.ReadBuffer(Buf,BufSize);
ComStream.Write(Buf,BufSize);
end;
i:=InStream.SizemodBufSize;
![](/icons/45469if.gif)
InStream.ReadBuffer(Buf,i);
ComStream.Write(Buf,i);
End;
InStream.Free;
InStream:=nil;
//注先后
ComStream.Free;
ComStream:=nil;
//在此写加密流代码(要先释放ComStream)
//EncryptStream(OutStream);
OutStream.Free;
OutStream:=nil;
except
onE:Exceptiondobegin
![](/icons/45469if.gif)
InStream.Free;
![](/icons/45469if.gif)
OutStream.Free;
![](/icons/45469if.gif)
ComStream.Free;
MessageDlg(COMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;
//解压文件
procedureDecompressFile(Source,Target:String);
var
i:Integer;
Buf:
DecomStream:TDecompressionStream;
MemStream:TMemoryStream;
OutStream:TFileStream;
begin
![](/icons/45469if.gif)
Exit;
MemStream:=Nil;
OutStream:=nil;
DecomStream:=nil;
try
//生成流
//先读文件到MemStream中解密(Source只读).
//DecomStream
![](/icons/45469de.gif)
MemStream:=TMemoryStream.Create;
MemStream.LoadFromFile(Source);
//在此写解密流代码
//DecryptStream(MemStream);
OutStream:=TFileStream.Create(Target,fmCreateorfmShareDenyWrite);
DecomStream:=TDeCompressionStream.Create(MemStream);
{InStream:=TFileStream.Create(Source,fmOpenReadorfmShareDenyNone);
OutStream:=TFileStream.Create(Target,fmCreateorfmShareDenyWrite);
DecomStream:=TDeCompressionStream.Create(InStream);}
//解压流
repeat
i:=DecomStream.Read(Buf,BufSize);
OutStream.WriteBuffer(Buf,i);
until(i=0);
//注意先后
OutStream.Free;
OutStream:=nil;
DecomStream.Free;
DecomStream:=nil;
MemStream.Free;
MemStream:=Nil;
except
onE:Exceptiondobegin
![](/icons/45469if.gif)
MemStream.Free;
![](/icons/45469if.gif)
OutStream.Free;
![](/icons/45469if.gif)
DecomStream.Free;
MessageDlg(DECOMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;
//压缩文件到流
procedureCompressToStream(FileName:String;Stream:TStream);
var
i:Integer;
Buf:
![](/icons/45469byte.gif)
ComStream:TCompressionStream;
InStream:TFileStream;
begin
![](/icons/45469if.gif)
Exit;
InStream:=Nil;
ComStream:=nil;
try
//生成流
InStream:=TFileStream.Create(FileName,fmOpenReadORfmShareDenyNone); [Page]
ComStream:=TCompressionStream.Create(clMax,Stream);
//压缩流
fori:=1to(InStream.SizedivBufSize)dobegin
InStream.ReadBuffer(Buf,BufSize);
ComStream.Write(Buf,BufSize);
end;
i:=InStream.SizemodBufSize;
![](/icons/45469if.gif)
InStream.ReadBuffer(Buf,i);
ComStream.Write(Buf,i);
End;
InStream.Free;
InStream:=nil;
ComStream.Free;
ComStream:=nil;
//在此写加密流代码(要先释放ComStream),Postion=0
//EncryptStream(Stream);
except
onE:Exceptiondobegin
![](/icons/45469if.gif)
InStream.Free;
![](/icons/45469if.gif)
ComStream.Free;
MessageDlg(COMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;
//解压文件到流
procedureDecompressToStream(FileName:String;Stream:TStream);
var
i:Integer;
Buf:
DecomStream:TDecompressionStream;
MemStream:TMemoryStream;
begin
![](/icons/45469if.gif)
Exit;
MemStream:=Nil;
DecomStream:=nil;
try
//生成流
//先读文件到MemStream中解密(FileName只读).
//DecomStream
![](/icons/45469de.gif)
MemStream:=TMemoryStream.Create;
MemStream.LoadFromFile(FileName);
//在此写解密流代码
//DecryptStream(MemStream);
DecomStream:=TDeCompressionStream.Create(MemStream);
//解压流,Postion=0
repeat
i:=DecomStream.Read(Buf,BufSize);
Stream.WriteBuffer(Buf,i);
until(i=0);
Stream.Position:=0;
DecomStream.Free;
DecomStream:=nil;
MemStream.Free;
MemStream:=Nil;
except
onE:Exceptiondobegin
![](/icons/45469if.gif)
MemStream.Free;
![](/icons/45469if.gif)
DecomStream.Free;
MessageDlg(DECOMPRESS_ERROR+#10+E.Message,mtError,[mbOk],0); [Page]
end;
end;
end;
//压缩流
procedureCompressStream(InStream,OutStream:TStream);
var
i:Integer;
Buf:
![](/icons/45469byte.gif)
ComStream:TCompressionStream;
begin
ComStream:=Nil;
try
InStream.Position:=0;
ComStream:=TCompressionStream.Create(clMax,OutStream);
fori:=1to(InStream.SizedivBufSize)dobegin
InStream.ReadBuffer(Buf,BufSize);
ComStream.Write(Buf,BufSize);
end;
i:=InStream.SizemodBufSize;
![](/icons/45469if.gif)
InStream.ReadBuffer(Buf,i);
ComStream.Write(Buf,i);
End;
ComStream.Free;
ComStream:=nil;
//在此写加密流代码
//EncryptStream(OutStream);
except
onE:Exceptiondobegin
![](/icons/45469if.gif)
ComStream.Free;
MessageDlg(COMPRESS_STRM_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;
//解压流
procedureDecompressStream(InStream,OutStream:TStream);
var
i:Integer;
Buf:
DecomStream:TDecompressionStream;
begin
DecomStream:=nil;
try
//在此写解密流代码
//DecryptStream(InStream);
DecomStream:=TDeCompressionStream.Create(InStream);
repeat
i:=DecomStream.Read(Buf,BufSize);
OutStream.WriteBuffer(Buf,i);
until(i=0);
OutStream.Position:=0;
DecomStream.Free;
DecomStream:=nil;
except
onE:Exceptiondobegin
![](/icons/45469if.gif)
DecomStream.Free;
MessageDlg(DECOMPRESS_STRM_ERROR+#10+E.Message,mtError,[mbOk],0);
end;
end;
end;
end.
最新评论