我有ZipForge for Delphi XE2& Delphi XE2。
我尝试测试任何无效的zip存档(例如,未完全下载),就像在他们的演示中一样:
procedure TfmMain.bnStartClick(Sender: TObject);
begin
with Archiver do
begin
FileName := 'c:\2.zip';
OpenArchive;
try
TestFiles('*.*');
except
MessageDlg('Errors occurred in the archive file', mtError, [mbOk], 0);
end;
CloseArchive;
end;
end;
但是我的例外没有解雇; ZipForge的对话框而不是我的对话框。
我尝试了Abbrevia Component,但它甚至无法识别存档是否无效......
请帮助我让我的异常工作(不是ZipForge的),或者建议我为带有测试功能的zip文件提供更好的组件。谢谢!
答案 0 :(得分:2)
请注意,您可以修改ZIP文件,例如通过稍微截断它们,ZIP文件仍然有效。使用我的测试文件,我删除了最后的5000个字节,并报告为有效。我使用我的ZIP程序成功解压缩了它。当然,提取的内容不正确,而不是原始内容。也许这就是你发生的事情。也许你试图破坏你的ZIP文件实际上并没有把它变成一个无效的ZIP文件。
Delphi XE2附带一个内置的ZIP组件,在我的简单测试中运行良好,成功检测到无效文件,一旦我将文件截断到足以使其真正损坏。
我使用IsValid
方法检查有效性。这是我非常简单的测试程序。
program ZipTest;
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.Zip;
procedure Main;
const
ZipArchive = 'C:\desktop\test.zip';
var
ZipFile: TZipFile;
FileName: string;
begin
ZipFile := TZipFile.Create;
try
if ZipFile.IsValid(ZipArchive) then begin
ZipFile.Open(ZipArchive, zmRead);
for FileName in ZipFile.FileNames do begin
Writeln(FileName);
end;
end else begin
Writeln(ZipArchive + ' not valid');
end;
finally
ZipFile.Free;
end;
end;
begin
try
Main;
Readln;
except
on E: Exception do begin
Writeln(E.ClassName, ': ', E.Message);
end;
end;
end.
答案 1 :(得分:1)
如果您的ZIP文件无效,则OpenArchive
的调用很可能会失败。只要你的执行处理不包括这种情况,你就会得到你描述的结果。
更新:在TestFiles
或任何其他方法中捕获异常的建议方法是连接OnProcessFileFailure
事件处理程序。