ZipForge和无效的档案

时间:2012-01-14 07:11:26

标签: delphi testing compression zip

我有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文件提供更好的组件。谢谢!

2 个答案:

答案 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事件处理程序。