ZipForge и недействительные архивы - PullRequest
0 голосов
/ 14 января 2012

У меня есть ZipForge для 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 , но он даже не может распознать, если архив недействителен ...

Пожалуйста, помогите мне сделать мое исключение работающим (не ZipForge) или предложите мне лучший компонент для zip-файлов с функцией тестирования. Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Помните, что вы можете изменять файлы 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 голос
/ 14 января 2012

Если у вас неверный ZIP-файл, скорее всего, вызов OpenArchive не удастся. Пока ваша обработка исключений не охватывает этот случай, вы получите описанный вами результат.

Обновление: предлагаемый способ перехвата исключений во время TestFiles или любым другим способом - подключить обработчик событий OnProcessFileFailure.

...