大家好啊!我是Delphi超级菜鸟,而且第一次在这个论坛上逛啊~ 很多东西还不熟悉啊~~~见谅见谅!
我所用的是 Delphi 7,并使用了VCLZip组件。
以下是我想要提问的源代码:procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
With VCLZip1 do
begin
ZipName := '文件目录\实验文件.zip'; //ZIP文件名
Destdir:='Temp\'; //解压到的目录
FilesList.Add('*.*');
DoAll := true;
Password:='abcdefg'; //密码
Recurse := True;
StorePaths := true;
unzip;
end;
end;这段代码已经成功运行了。
但是现在有个问题,我发现如果目录下的Zip文件,即使是没有密码也会解压。我想请教一下:如何才能做到有密码且正确的解压,没有密码的不解压,最好是还能提示错误。
各位高手帮帮我吧~~~
我所用的是 Delphi 7,并使用了VCLZip组件。
以下是我想要提问的源代码:procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
With VCLZip1 do
begin
ZipName := '文件目录\实验文件.zip'; //ZIP文件名
Destdir:='Temp\'; //解压到的目录
FilesList.Add('*.*');
DoAll := true;
Password:='abcdefg'; //密码
Recurse := True;
StorePaths := true;
unzip;
end;
end;这段代码已经成功运行了。
但是现在有个问题,我发现如果目录下的Zip文件,即使是没有密码也会解压。我想请教一下:如何才能做到有密码且正确的解压,没有密码的不解压,最好是还能提示错误。
各位高手帮帮我吧~~~
winzip和winrar都是这样的.输错密码不会提示的.直接解压出一大段解密失败的文件.
其实,通过获取文件数量来判断,也是一个解决办法
以下是我通用的一个方法,看给你是否有所帮助
{{
解压缩文件,当SelFileExt =''时,将压缩文件全部解出来
如果不等于空,解出来指定后缀名的,当然可以是具体文件名,但有时具体文件名确定不了,
所以采用后缀名比较好,当解出来以后,再采用文件名来处理更实际。
其中判断错误密码的是根据需要解出来的文件数目和实际解出来的文件数目对比,
}
function UnZipFile(const DesPathName, ZipFileName: string;
ZipPassWord: string = '';SelFileExt: string=''): Boolean;
var
i,lncount: Integer;
AZip: TVCLZip;
begin
Result := False;
lncount := 0;
AZip := TVCLZip.Create(nil);
try
with AZip do
begin
ZipName := ZipFileName;
DestDir := DesPathName;
if ZipPassWord = '' then
Password := ZiperZBPsw
else
Password := ZipPassWord; OverwriteMode := TUZOverwriteMode(1); //总是覆盖
ZipAction := TZipAction(0);//
RecreateDirs := True;
RetainAttributes := True;
ReplaceReadOnly := True;
try
AZip.ReadZip;
if SelFileExt = '' then
begin
DoAll := True; //如果设置了这个,即使你unZipSelected也会解出所有的
lnCount := Count;
i := UnZip ;
end
else
begin
for i := 0 to Count - 1 do
if Pos(SelFileExt,LowerCase(Filename[i]))>0 then
begin
Selected[i] := True;
Inc(lncount);
end;
i := UnZipSelected;
end;
if i = lncount then
Result := i <> 0
else
begin
if Assigned(WaitDlgForm) then FreeAndNil(WaitDlgForm);
if (lncount > 0) and (i = 0) then
raise Exception.Create('密码错误!')
else
raise Exception.Create('无法解密所有文件!');
end
except
on E:Exception do
begin
if Assigned(WaitDlgForm) then FreeAndNil(WaitDlgForm);
if Pos('Incomplete Zip File', E.Message) > 0 then
MsgBox('不正确的文件格式!')
else
MsgBox('解密文件出错:' + E.Message);
Abort;
end;
end;
end;
finally
FreeAndNil(AZip);
end;
end;
如果我原来的Zip被别人的没有密码的Zip替换了的话,我的程序也照样会解压这个Zip并运行这个Zip里面的文件,只要别人的Zip可以把文件名弄得跟我原来的Zip一样就会出现这样的问题。现在主要就是想要实现:没有密码的Zip不解压并提示“不是合法的Zip文件”。请各位高手不吝赐教!
With UnZip1 do
begin
UnZip1.ArchiveStream:=TFileStream.Create('文件目录\实验文件.zip',fmOpenRead);
//文件流打开压缩包
if UnZip1.CheckArchive then //无密码检测压缩包
begin
showmessage('错误!');
UnZip1.ArchiveStream.Free; //关闭文件流
exit; //结束执行后面的代码,即做到了 无密码,不解压。
end;
………………………………………… //解压过程,楼主的方面修改下就行。
UnZip1.ArchiveStream.Free; //关闭文件流
end;
但是我遇到奇怪的问题,unrar在我开发电脑上正常工作,换台电脑,不解压缩了。