求教:如何压缩一个文件夹 ( 积分: 100 )

  • 主题发起人 主题发起人 wind_2005
  • 开始时间 开始时间
W

wind_2005

Unregistered / Unconfirmed
GUEST, unregistred user!
我在网上查了一些资料,知道可以通过TCompressionStream和TDecompressionStream来压缩和解压。
但是,如何通过他们来压缩一个文件夹下的所有内容呢?
急用!
谢谢!
 
用三方控件ZipTV吧,见贴:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3660542 的讨论。该控件有Demo
 
谢谢bjaman,但是我想通过TCompressionStream和TDecompressionStream写,这样可以避免使用第三方控件,哪位高人知道,帮帮我,谢谢了!
 
用zlib 单元 的TCompressionStream,TDecompressionStream流
uses zlib;

function zip(instr:string;var outstr:string):boolean;
var
CS:TCompressionStream;
buffer:pchar;
MemoStream:TmemoryStream;
strStream:TstringStream;
begin
MemoStream:=TMemoryStream.Create;
strStream:=Tstringstream.Create('');
try
buffer:=pchar(instr);
// TCompressionLevel = (clNone, clFastest, clDefault, clMax);
Cs:=TCompressionStream.Create(clMax,MemoStream);
try
Cs.Write(buffer^,length(instr));
finally
Cs.Free;
end;
MemoStream.Position :=0;
MemoStream.SaveToStream(strStream);
outstr:=strStream.DataString;
result:=true;
finally
strstream.free;
MemoStream.Free;
end;
end;


function unzip(instr:string;var outstr:string):boolean;
var
c:integer;
DS:TDecompressionStream;
buffer:pchar;
outbuffer:array [1..512] of byte;
MemoStream:TmemoryStream;
strStream:TstringStream;
begin
MemoStream:=TMemoryStream.Create;
strStream:=Tstringstream.Create('');
DS:=TDecompressionStream.Create(MemoStream);
try
try
buffer:=pchar(instr);
MemoStream.Write(buffer^,length(instr));
MemoStream.Position :=0;
repeat
c:=DS.Read(outbuffer,512);
if c>0 then strStream.Write(outbuffer,c)
until c=0;
finally
ds.Free;
end;
outstr:=strStream.DataString;
result:=true;
finally
strstream.free;
MemoStream.Free;
end;
end;
 
Avalon
谢谢你,你的这两个函数可以压缩一个文件夹下的所有文件吗?
 
TCompressionStream和TDecompressionStream 只能对流进行压缩,对于对一个文件夹的文件压缩,那还要你自己对压缩过的流重新组织成一个文件。
 
liyinwei,你是说将所有文件进行压缩,而后再组织到一个文件中去?
 
告诉你个简单的吧,我把我写的函数都送你,用arj,你到网上搜下这个exe文件就可以了,很方便 function ShellExec_ARJ(const pFile,pParameters: string): Boolean;
var
A_ShellExecuteInfo: SHELLEXECUTEINFO;
A_Handle: HWND;
begin
with A_ShellExecuteInfo do
begin
cbSize := SizeOf(SHELLEXECUTEINFO);
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := A_Handle;
lpVerb := nil;
lpFile := PChar(pFile);
lpParameters := PChar(pParameters);
lpDirectory := nil;
nShow := SW_HIDE;
hInstApp := A_Handle;
end;
try
if ShellExecuteEx(@A_ShellExecuteInfo) then
begin
WaitForSingleObject(A_ShellExecuteInfo.hProcess, INFINITE);
Result := True;
end;
except
Result := False;
end;
end;
 
忘了一点说明哈 ,不好意思 lpFile := PChar(pFile); //arj的全路径和arj名字哈
lpParameters := PChar(pParameters); //这个就是压缩名字参数,具体怎么写,你看哈帮助就晓得了
 
多人接受答案了。
 
后退
顶部