powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Распаковка многотомного ZIP архива
25 сообщений из 49, страница 1 из 2
Распаковка многотомного ZIP архива
    #39151464
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем времени суток!

Есть очень важная задача программно распаковать многотомный архив. Количество томов может быть разным.
Пользуюсь версией XE8

Изначально пробовал средствами встроенного класса TZipFile вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TForm1.Button1Click(Sender: TObject);
var
  fzip: TZipFile;
begin
  showMessage('Ща буду распаковывать');
  fzip := TZipFile.Create();
  try
      fzip.ExtractZipFile('E:\Projects\TestUnzip\Win32\Debug\test\test.zip','E:\Projects\TestUnzip\Win32\Debug\test');
  except
    on E : Exception do
      ShowMessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message);
  end;
  fzip.Free;
end;


Результат: EZipException поднята ошибка, с сообщением : Error reading zip file

Переписал это же добро под использование 7z.dll и прикрутил к проекту sevenzip.pas

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
try
    with CreateInArchive(CLSID_CFormatZip) do
      begin
        OpenFile('D:\repositaries\variussoft\testUnzip\Win32\Debug\testzip.zip');
        SetProgressCallback(nil, ProgressCallback);
        ExtractTo('D:\repositaries\variussoft\testUnzip\Win32\Debug\1');
      end;
  except on E: Exception do
    ShowMessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message);
  end;


Результат: Exception поднята ошибка, с сообщением : Неверная функция

Буду благодарен за любой совет!
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151468
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При этом с однотомными архивами никакой проблемы нет ни стандартным функционалом, ни 7z
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151526
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRain,

Попробуй модуль JclCompression из JCL - насколько я помню, ихний TJclCompressionArchive поддерживает многотомные архивы.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151536
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему нельзя сделать сабж с помощью банальной командной строки ?
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151555
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV, потому что распаковка - это часть бизнес процесса более сложного приложения и одна из задач - сделать всё внутри одного приложения, не привязываясь к сторонним. Есть вероятность, что на рабочей станции будущего пользователя не будет установлен тот же винрар к примеру, таскать вместе со своей программой ещё сторонние exe - в моём случае очень плохая затея.
Если же я неправильно понимаю предложение, поясните пожалуйста.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151559
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил проблему с ошибкой: Неверная функция.
Проблема оказалась в версии библиотеки. Скачал с оф сайта 9.38, взял библиотеку оттуда, всё заработало.

Но!
1. В качестве имени файла нужно передавать не сам архив а его первую часть и...
Охохохох. Выгруженный файл был, так сказать, не совсем тем, который я туда упаковал. А именно имел размер всего 117 мегабайт из запакованных 900.
Перепаковал, изменив размер тома на 200 метров, и снова распаковал и снова получил в ответ неполный файл, а кусочек из 222 метров. То есть распаковывается только та часть архива, которую я указываю. остальные не подтягиваются.

Попытаюсь сейчас скачать установить JCL, посмотрим, что из этого выйдет.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151564
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRainLSV, потому что распаковка - это часть бизнес процесса более сложного приложения и одна из задач - сделать всё внутри одного приложения, не привязываясь к сторонним. Есть вероятность, что на рабочей станции будущего пользователя не будет установлен тот же винрар к примеру, таскать вместе со своей программой ещё сторонние exe - в моём случае очень плохая затея.
Если же я неправильно понимаю предложение, поясните пожалуйста.Ну все равно ваш продукт будет использовать что-то сторонее. Зачем этого боятся ? К счастью архиватор это просто ехе-файл. Таскайте его с приложением (выгружайте автоматом при старте).
В чем проблемы ?

У других продуктов проблемы в сто раз сложнее, т.к. зачастую они сильно зависят от стороннего ПО, которое не идет с самим продуктом: конективити, драйвера, сом-объекты, ДЛЛ ядра и пр.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151571
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVНу все равно ваш продукт будет использовать что-то сторонее. Зачем этого боятся ? К счастью архиватор это просто ехе-файл. Таскайте его с приложением (выгружайте автоматом при старте).
В чем проблемы ?

У других продуктов проблемы в сто раз сложнее, т.к. зачастую они сильно зависят от стороннего ПО, которое не идет с самим продуктом: конективити, драйвера, сом-объекты, ДЛЛ ядра и пр.

Проблема кроется немного в другом, я должен упростить свой продукт на столько сильно, на сколько это вообще возможно.
Потенциальные пользователи - оооочень неумелы, программа не будет устанавливаться или ещё каким-то умным образом давать пользователю только ярлычок. Они будут качать архивчик и в нём будет один экзешник и возможно одна дллка, они будут счастливы, что не запутались и клацнут именно туда, куда надо. Чем больше лишнего там будет, тем сложнее будет жить... Слышал, что сторонние файлы (типа файлов конфигурации и dll) можно и вовсе вшить внутрь exe файла, правда с этим не сталкивался. Но один exe в другой уже не завернёшь...
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151583
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRainНо один exe в другой уже не завернёшь...

Ресурсы? Не, не слышал...
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151587
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterРесурсы? Не, не слышал...
не слышал... можно подробнее?
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151594
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRain,

В ресурсы можно вшить хоть слона. Во время работы достаешь из ресурсов необходимый тебе exe во временную папочку, запускаешь, ждешь пока отработает, удаляешь.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151612
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRain,

По шагам:

1) Делаем .RC файл (например ARCH.RC)

MYARCHIVER RCDATA c:\archiver\archiver.exe

2) Запихиваем ресурсы в EXE
{$R 'ARCH.res' 'ARCH.RC'}

2) Доступаемcя

Код: pascal
1.
2.
3.
var ResStream: TResourceStream;

ResStream := TResourceStream.Create(hInstance, 'MYACRCHIVER', RT_RCDATA);



Фсе ;)
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39151633
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у вас есть БД, то можно воткнуть туда.
У меня так сделано обновление проги. Прога зырит в БД и видит дату файла. Сравнивает и сигналит если надо обновлять.
Жмем "Обновить".
Файлик вытаскивается из базы и копируется рядом. Потом передается управление прожечке, кот. скопирует новый файл поверх старого.
Основная прога закрывается, прожечка меняет файлик и запускает его.
На все менее 5сек.

Развертывание еще проще: если вижу, что новая версия проги нормально работает, просто жму "Загрузить в БД". Через 2 сек все юзеры могут обновляться (у них выскочит соотв. сообщение).

Никаких сайтов, ftp, общих папок или таскания на флешке.
Прога - дестоп-приложение для БД.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152544
qwertEHOK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какие ресурсы, вставлять файл в базу?
что за ужас

простой же вопрос - как распаковать многотомный архив? лучше без внешнего приложения

сейчас обертка над 7z отлично распаковывает одиночные файлы и отлично распаковался первая часть многотомного архива
как распаковать остальное?

Код: pascal
1.
2.
3.
4.
5.
6.
  sz:= CreateInArchive(CLSID_CFormatZip);
  with sz do begin
    OpenFile('c:\temp\delphi\123.z01');
    SetProgressCallback(nil, ProgressCallback);
    ExtractTo('c:\temp\delphi\');
  end;
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152548
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwertEHOK,

Я подозреваю, что стоит проделать ту же операцию над всеми частями многотомного архива.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152582
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRain,

очень мало информации на эту тему. единственное, что нашел, что надо курить в сторону IArchiveOpenVolumeCallback, но примеров не видел, сам интерфейс реализован, но возвращает всегда S_OK...
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152639
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я достаточно плотно ковыряюсь с 7z, пишу (в принципе, уже написано) интеграцию 7z с Проводником, что бы можно открывать 7z архивы как папки. Могу сказать следующее. В контексте формата zip cама 7z не знает ни о каких томах. 7z работает с обезличенным потоком, у которого нет имени. Поэтому в 7z нужно передавать уже готовый поток, в котором слиты воедино все тома. Я это делаю путем создания потока-посредника, который уже и реализует чтение из конкретных томов. Как это сделано в jcl - я не знаю, смотри их код.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152642
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterNapalmRain,

Попробуй модуль JclCompression из JCL - насколько я помню, ихний TJclCompressionArchive поддерживает многотомные архивы.
Есть ли хоть какой-нибудь маломальский пример того, как этим пользоваться? Ничего толкового найти не смог...
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152665
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AniskinЯ достаточно плотно ковыряюсь с 7z, пишу (в принципе, уже написано) интеграцию 7z с Проводником, что бы можно открывать 7z архивы как папки. Могу сказать следующее. В контексте формата zip cама 7z не знает ни о каких томах. 7z работает с обезличенным потоком, у которого нет имени. Поэтому в 7z нужно передавать уже готовый поток, в котором слиты воедино все тома. Я это делаю путем создания потока-посредника, который уже и реализует чтение из конкретных томов. Как это сделано в jcl - я не знаю, смотри их код.

А вот это интересная мысль...
За подсказку благодарю! Постараюсь подумать в этом направлении
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152773
qwertEHOK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMasterЯ подозреваю, что стоит проделать ту же операцию над всеми частями многотомного архива.

если подсовывать их по отдельности пишет ошибку - "Неверная функция"

я даже подумывал что нужно склеить все части и подсовывать как единый файл, но у файла должны же быть какие служебные признаки которые нужно удалить.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39152841
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRainDarkMasterNapalmRain,

Попробуй модуль JclCompression из JCL - насколько я помню, ихний TJclCompressionArchive поддерживает многотомные архивы.
Есть ли хоть какой-нибудь маломальский пример того, как этим пользоваться? Ничего толкового найти не смог...

У них демка живет в _JCL_INSTALLATION_FOLDER_\examples\windows\compression\archive\.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39153180
qwertEHOK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Демка на многотомный архив говорит - Not Supported format (((
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39153203
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwertEHOKДемка на многотомный архив говорит - Not Supported format (((

Not Supported format обозначает, что ты передаешь несоответствующий тип архива в распаковщик. Например, передаешь zip архив в распаковщик 7z, или наоборот.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39153243
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwertEHOK,

Нужно список Volume составить:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 LArchive := TJcl7zDecompressArchive.Create(AInputFile, GetFileSize(AInputFile, nil));   // первый FILENAME.001

  for VolumeIndex := 2 to 999 do 
   begin
      VolumeName := ChangeFileExt(AInputFile, Format('.%.3d', [VolumeIndex]));
      if FileExists(VolumeName) then 
         begin
            VolumeSize   := GetFileSize(VolumeName, nil);
            LArchive.AddVolume(VolumeName, VolumeSize);
         end 
      else break;
  end
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39153639
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

не очень понял, что должно быть в переменной AInputFile
Передаю туда имя файла, получаю
Код: pascal
1.
[dcc32 Error] Unit1.pas(71): E2010 Incompatible types: 'NativeUInt' and 'string'


Передаю туда поток с файлом, получаю аналогичную ошибку...
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Распаковка многотомного ZIP архива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]