最近在写TCP程序,要用到压缩传输,因此写了两个函数。用到了zlib库
{------------------------------------------------------------------------------}
{压缩流}
function CommpressStream(Source :TFileStream):TMemoryStream;
var
dest,SMemory,rtn :TMemoryStream;
PressStream:TCompressionStream;
count :Int64;
begin
dest := TMemoryStream.Create;
SMemory :=TMemoryStream.Create;
rtn := TMemoryStream.Create;
PressStream := TCompressionStream.Create(clMax,dest);
try
Source.Position := 0;
Count := Source.Size;
SMemory.CopyFrom(Source,Count);
SMemory.SaveToStream(PressStream);
PressStream.Free;
rtn.WriteBuffer(Count, Sizeof(Count));
rtn.CopyFrom(dest,0);
rtn.Position := 0;
finally
SMemory.Free;
dest.Free;
end;
Result := rtn;
end;
{------------------------------------------------------------------------------}
{解压缩流}
procedure DECommpressStream(Source :TMemoryStream; destfile :string);
var
count :Int64;
SourceStream:TDecompressionStream;
DFstream :TFileStream;
buffer :Pointer;
begin
Source.Position := 0;
Source.ReadBuffer(Count, Sizeof(Count));
SourceStream := TDecompressionStream.Create(Source);
GetMem(buffer,count);
try
DFstream := TFileStream.Create(destfile,fmCreate);
SourceStream.ReadBuffer(Buffer^,Count);
DFstream.WriteBuffer(Buffer^,Count);
finally
FreeMem(Buffer);
SourceStream.Free;
FreeAndNil(DFstream);
end;
end;
例子:
var
dfile :TFileStream;
fs :TMemoryStream;
begin
dfile := TFileStream.Create(GetPath(edt_up.Text),FmopenRead);
fs := TMemoryStream.Create;
fs := CommpressStream(dfile);
fsize := fs.Size;
FreeAndNil(dfile);
.............................
{------------------------------------------------------------------------------}
{压缩流}
function CommpressStream(Source :TFileStream):TMemoryStream;
var
dest,SMemory,rtn :TMemoryStream;
PressStream:TCompressionStream;
count :Int64;
begin
dest := TMemoryStream.Create;
SMemory :=TMemoryStream.Create;
rtn := TMemoryStream.Create;
PressStream := TCompressionStream.Create(clMax,dest);
try
Source.Position := 0;
Count := Source.Size;
SMemory.CopyFrom(Source,Count);
SMemory.SaveToStream(PressStream);
PressStream.Free;
rtn.WriteBuffer(Count, Sizeof(Count));
rtn.CopyFrom(dest,0);
rtn.Position := 0;
finally
SMemory.Free;
dest.Free;
end;
Result := rtn;
end;
{------------------------------------------------------------------------------}
{解压缩流}
procedure DECommpressStream(Source :TMemoryStream; destfile :string);
var
count :Int64;
SourceStream:TDecompressionStream;
DFstream :TFileStream;
buffer :Pointer;
begin
Source.Position := 0;
Source.ReadBuffer(Count, Sizeof(Count));
SourceStream := TDecompressionStream.Create(Source);
GetMem(buffer,count);
try
DFstream := TFileStream.Create(destfile,fmCreate);
SourceStream.ReadBuffer(Buffer^,Count);
DFstream.WriteBuffer(Buffer^,Count);
finally
FreeMem(Buffer);
SourceStream.Free;
FreeAndNil(DFstream);
end;
end;
例子:
var
dfile :TFileStream;
fs :TMemoryStream;
begin
dfile := TFileStream.Create(GetPath(edt_up.Text),FmopenRead);
fs := TMemoryStream.Create;
fs := CommpressStream(dfile);
fsize := fs.Size;
FreeAndNil(dfile);
.............................