Проблема при распаковке архива Ods

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
lightning
новенький
Сообщения: 11
Зарегистрирован: 18.02.2010 16:39:57

Проблема при распаковке архива Ods

Сообщение lightning »

Возникла проблема при распаковке архива Ods при помощи модуля Zipper. Ступор происходит на файле content.xml, выдает ошибку "Invalid CRC checksum while unzipping content.xml" и дальше не идет, с архивом все в порядке, не битый. Может кто-нибудь сталкивался с такой проблемой, подскажите решение. Ось Windows, Lasarus v0.9.28.2бета
lightning
новенький
Сообщения: 11
Зарегистрирован: 18.02.2010 16:39:57

Сообщение lightning »

Вопрос жизни и смерти! Подскажите, очень надо!
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Вот обсуждение формата ODT (распаковка упаковка при помощи Zippera), у меня все открывает и запаковывает назад. ODS тоже лично мной проверено на моем модуле все работает как часы.
Ну уж если не помогло предлагаю свой код:

Код: Выделить всё

procedure TOODocument.LoadFromFile(const FileName: String);
var UnZip:TUNZipper;

Procedure LoadDoc(var XMLDoc: TXMLDocument;
  const XMLFileName: String);
begin
  FreeAndNil(XMLDoc);

  if FileExists(XMLFileName) then
  ReadXMLFile(XMLDoc, XMLFileName);
end;

begin
  if not FileExists(FileName) then exit; //Файла нет, подстава блин...

  FullRemoveDir(FTempPath,False); //Очистка папки темп от старых файлов

  UnZip:=TUNZipper.Create;

  UnZip.FileName   := FileName;
  UnZip.OutputPath := FTempPath;
  try
   UnZip.UnZipAllFiles;  //Распаковка файлов
  finally
    UnZip.Free;
  end;

 //Загрузка файлов в соответствующие XML документы
  LoadDoc(FContent,FTempPath+'content.xml'); //content.xml
  LoadDoc(FManifest,IncludeTrailingPathDelimiter(FTempPath+'META-INF')+'manifest.xml');//META-INF/manifest.xml
  LoadDoc(FMeta,FTempPath+'meta.xml');     //meta.xml
end; 
lightning
новенький
Сообщения: 11
Зарегистрирован: 18.02.2010 16:39:57

Сообщение lightning »

Я использовала вот такой простой код для теста:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  UnZipper: TUnZipper;
begin
  UnZipper := TUnZipper.Create;
  try
    UnZipper.FileName := 'test.ods';
    UnZipper.OutputPath := 'test';
    try
      UnZipper.UnZipAllFiles;
    except
      on E: Exception do InputBox('', '', E.Message);
    end;
  finally
    FreeAndNil(UnZipper);
  end;
end;


Добавлено спустя 1 час 17 минут 32 секунды:
Я делаю так же, на Ubuntu все работает, а на Windows отказывается :( Windows XP Professional Service Pack 2 :(
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

lightning писал(а):Я делаю так же, на Ubuntu все работает, а на Windows отказывается

Он так и пишет в ошибках:
"Отказываюсь, потому что меня не поють пивом"? :D
lightning
новенький
Сообщения: 11
Зарегистрирован: 18.02.2010 16:39:57

Сообщение lightning »

Vadim писал(а):
lightning писал(а):Я делаю так же, на Ubuntu все работает, а на Windows отказывается

Он так и пишет в ошибках:
"Отказываюсь, потому что меня не поють пивом"? :D

Да если бы :) , ошибка: Invalid CRC checksum while unzipping content.xml
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Ну мой код распаковки (указан выше) и упаковки см тему про ODT. Работает и в линухе и в Windows XP SP3. Возможно все связано с самим LCL, я юзаю Лазарус 0.9.29 и FPC 2.4.3 возможно со времени вашей версии Zipper был допилен. Так что мой вам совет скачайте вот отсюда сборку для винды.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Допилен-допилен, причем недавно. Нужно брать свежий unzipper, старый не понимает od? форматов. Точнее, он не понимает, что в них CRC записан не до содержимого файла, а после.
lightning
новенький
Сообщения: 11
Зарегистрирован: 18.02.2010 16:39:57

Сообщение lightning »

Действительно, скачала новую сборку Lasarus, всё работает! :) Благодарю за помощь!
Ответить