RtTool/Delphi7/开发档案/英文版/ThreeFun/Fun/U_CompressionFun.pas
2025-01-08 11:55:07 +08:00

115 lines
3.2 KiB
ObjectPascal

unit U_CompressionFun;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, ShlObj, cxShellCommon, cxControls, cxContainer,
cxShellTreeView, cxShellListView, StdCtrls, BtnEdit, OleCtnrs, DB, ADODB, ZLib;
procedure CompressionStream(var ASrcStream: TMemoryStream; ACompressionLevel: Integer = 2);
procedure UnCompressionStream(var ASrcStream: TMemoryStream);
procedure GetFileInfo(mFile: string; var mfileSize: integer; var CreationTime: tdatetime; var WriteTime: tdatetime);
function CovFileDate(Fd: _FileTime): TDateTime;
implementation
procedure GetFileInfo(mFile: string; var mfileSize: integer; var CreationTime: tdatetime; var WriteTime: tdatetime);
var
vSearchRec: TSearchRec;
begin
FindFirst(mFile, faAnyFile, vSearchRec);
mfileSize := vSearchRec.Size;
CreationTime := CovFileDate(vSearchRec.FindData.ftCreationTime); //创建时间
//vSearchRec.FindData.ftLastAccessTime//访问时间
WriteTime := CovFileDate(vSearchRec.FindData.ftLastWriteTime); //修改时间
FindClose(vSearchRec);
end;
function CovFileDate(Fd: _FileTime): TDateTime;
var
Tct: _SystemTime;
Temp: _FileTime;
begin
FileTimeToLocalFileTime(Fd, Temp);
FileTimeToSystemTime(Temp, Tct);
CovFileDate := SystemTimeToDateTime(Tct);
end;
////////////////////////////////////////////////////
///////压缩流
////////////////////////////////////////////////////
procedure CompressionStream(var ASrcStream: TMemoryStream; ACompressionLevel: Integer = 2);
var
nDestStream: TMemoryStream;
nTmpStream: TCompressionStream;
nCompressionLevel: TCompressionLevel;
begin
ASrcStream.Position := 0;
nDestStream := TMemoryStream.Create;
try
//级别
case ACompressionLevel of
0:
nCompressionLevel := clNone;
1:
nCompressionLevel := clFastest;
2:
nCompressionLevel := clDefault;
3:
nCompressionLevel := clMax;
else
nCompressionLevel := clMax;
end;
//开始压缩
nTmpStream := TCompressionStream.Create(nCompressionLevel, nDestStream);
try
ASrcStream.SaveToStream(nTmpStream);
finally
nTmpStream.Free; //释放后nDestStream才会有数据
end;
ASrcStream.Clear;
ASrcStream.LoadFromStream(nDestStream);
ASrcStream.Position := 0;
finally
nDestStream.Clear;
nDestStream.Free;
end;
end;
////////////////////////////////////////////////////
///////解压缩流
////////////////////////////////////////////////////
procedure UnCompressionStream(var ASrcStream: TMemoryStream);
var
nTmpStream: TDecompressionStream;
nDestStream: TMemoryStream;
nBuf: array[1..512] of Byte;
nSrcCount: integer;
begin
ASrcStream.Position := 0;
nDestStream := TMemoryStream.Create;
nTmpStream := TDecompressionStream.Create(ASrcStream);
try
repeat
//读入实际大小
nSrcCount := nTmpStream.Read(nBuf, SizeOf(nBuf));
if nSrcCount > 0 then
nDestStream.Write(nBuf, nSrcCount);
until (nSrcCount = 0);
ASrcStream.Clear;
ASrcStream.LoadFromStream(nDestStream);
ASrcStream.Position := 0;
finally
nDestStream.Clear;
nDestStream.Free;
nTmpStream.Free;
end;
end;
end.