powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Распаковка многотомного ZIP архива
49 сообщений из 49, показаны все 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
Распаковка многотомного ZIP архива
    #39154068
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыдущая ошибка касалась, как выяснилось, функции GetFileSize
Но это мелочи...
Вот катастрофически примитивный код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
try
    showmessage('0');
    aArchive := TJclDecompressArchive.Create('D:\test\files\testarchive.zip.001');
    showmessage('1');
    aArchive.AddVolume('D:\test\files\testarchive.zip.002');
    showmessage('2');
    aArchive.AddVolume('D:\test\files\testarchive.zip.003');
    showmessage('3');
    aArchive.AddVolume('D:\test\files\testarchive.zip.004');
    showmessage('4');
    aArchive.AddVolume('D:\test\files\testarchive.zip.005');
    showmessage('5');
    aArchive.AddVolume('D:\test\files\testarchive.zip.006');
    showmessage('6');
    aArchive.AddVolume('D:\test\files\testarchive.zip.007');
    showmessage('7');
    aArchive.AddVolume('D:\test\files\testarchive.zip.008');
    showmessage('8');
    aArchive.AddVolume('D:\test\files\testarchive.zip.009');
    showmessage('9');
    aArchive.AddVolume('D:\test\files\testarchive.zip.010');
    showmessage('Extract');
    aArchive.ExtractAll('D:\test');
    showmessage('Done');
  except
    on E : Exception do
      ShowMessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message);
  end;


срабатывает по нажатию на кнопку. Выдаёт все сообщения в том числе и Done, никаких эксепшнов, ничего. И распаковки, собственно, тоже никакой...
Если у кого-то есть опыт работы с данным компонентом, буду чрезвычайно благодарен за подсказку!
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39154072
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Замени TJclDecompressArchive на TJclZipDecompressArchive.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39154146
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRain,

Можно еще принудительно все элементы в архиве выставить в Selected.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39154156
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AniskinЗамени TJclDecompressArchive на TJclZipDecompressArchive.
Да, благодарю, всё получилось, но теперь новая проблема: EIntOverflow

Если я правильно понимаю, проблема в размере архива, благо эта хрень весит 8 гигов...
Если брать более новую версию 7z.dll, которая, как я думаю, должна бы уметь работать с 64 разрядными архивами,
получаю ошибку:
Код: pascal
1.
failed to load 7z.dll



Как я понимаю, самый простой для меня способ будет всё-таки использовать некий консольный архиватор.
Если у кого-то есть мысли в этом направлении, поделитесь пожалуйста!

Заранее благодарю!
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39154159
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NapalmRainЕсли у кого-то есть мысли в этом направлении, поделитесь пожалуйста
У меня есть мысль, что неплохо бы было взять в ручки дебаггер, и посмотреть, в каком же месте происходит исключение и его причины, и посмотреть, что странного происходит при загрузке 7z.dll.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39154191
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AniskinNapalmRainЕсли у кого-то есть мысли в этом направлении, поделитесь пожалуйста
и посмотреть, что странного происходит при загрузке 7z.dll.

A вот нефиг грузить из х32 приложения х64 библиотеку.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39154192
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NapalmRain
Как я понимаю, самый простой для меня способ будет всё-таки использовать некий консольный архиватор.
Если у кого-то есть мысли в этом направлении, поделитесь пожалуйста!



В принципе об этом уже говорили. А что непонятного в использовании? Вызов CreateProcess() с ожиданием завершения проблема? Тогда в JCL той же уже есть готовые функции.

P.S. Насчет EIntOverflow непонятно - у JclXXXXDecompression все рабочие переменые в int64 - это еще постараться надо, чтобы на такое нарваться. И да, попробуй заменить версию 7z.dll на более новую.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39156120
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterA вот нефиг грузить из х32 приложения х64 библиотеку.
Это было логичное предположение, но я скомпилировал приложение под 64 бита и ошибка не пропала.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function TJclSevenzipDecompressArchive.GetInArchive: IInArchive;
var
  SevenzipCLSID, InterfaceID: TGUID;
begin
  if not Assigned(FInArchive) then
  begin
    SevenzipCLSID := ArchiveCLSID;
    InterfaceID := Sevenzip.IInArchive;
    if (not Is7ZipLoaded) and (not Load7Zip) then
      raise EJclCompressionError.CreateRes(@RsCompression7zLoadError);
    if (Sevenzip.CreateObject(@SevenzipCLSID, @InterfaceID, FInArchive) <> ERROR_SUCCESS) // как сказал дебаггер эксепшин происходит в этой строчке
      or not Assigned(FInArchive) then
      raise EJclCompressionError.CreateResFmt(@RsCompression7zInArchiveError, [GUIDToString(SevenzipCLSID)]);
    FExtractingAllIndex := -1;
  end;
  Result := FInArchive;
end;



тогдка как переполнение Int происходит
Код: pascal
1.
2.
3.
4.
    NbIndices := ItemCount;
    SetLength(Indices, NbIndices);
    for Index := 0 to NbIndices - 1 do // вот здесь
    begin



Переменная Index имеет тип Integer я заменил её на integer64 , но ошибка осталась
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39156597
NapalmRain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем я таки решил использовать сторонний архиватор.
Два дня тестов дали результат практически тот, который интересует.
Для использования взял последнюю версию 7z.exe

Если кому интересно, конечный вариант:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    ExtractTo('D:\test\test.zip.001', 'D:\test');
  except on E: Exception do
    ShowMessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message);
  end;
end;


Где в процедуре ExtractTo может быть два варианта

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure ExtractTo(AArchive, ADestPath: String);
var
  Cmd, Params: String;
begin
  Params:= Format('x -y %s -o%s', [AArchive, ADestPath]);
  Cmd:= '7z.exe';
  OutputDebugString(PChar(Cmd + ' ' + Params));
  ShellExecute(Cmd+' '+Params); // 1 вариант
  ShellExecuteWait(Cmd, Params); // 2 вариант
end;



Для второго варианта
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function ShellExecuteWait(AppName, Params: String; WaitTime: Cardinal = INFINITE; ShowMode: Integer = SW_SHOWMINIMIZED): integer;
var
  ShellInfo: TShellExecuteInfo;
  ExitCode: Cardinal;
begin
  Screen.Cursor:= crAppStart;
  try
    with ShellInfo do
    begin
      cbSize:= SizeOf(TShellExecuteInfo);
      fMask:= SEE_MASK_NOCLOSEPROCESS;
      Wnd:= HWND_DESKTOP;
      lpVerb:= 'open';
      lpFile:= PChar(AppName);
      lpParameters:= PChar(Params);
      lpDirectory:= nil;
      nShow:= ShowMode;
    end;

    if not ShellExecuteEx(@ShellInfo) then RaiseLastOSError;

    if ShellInfo.hProcess <> 0 then
      try
        WaitForSingleObject(ShellInfo.hProcess, INFINITE);
        GetExitCodeProcess(ShellInfo.hProcess, ExitCode);
        Result:= ExitCode;
      finally
        CloseHandle(ShellInfo.hProcess);
      end
    else
      Result:= -1;
    Application.BringToFront;
    //SetForegroundWindow(Application.MainForm.Handle);
  finally
    Screen.Cursor:= crDefault;
  end;
end;



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

А каким образом Вы готовите поток, в котором слиты воедино все тома? Простое слияние упорядоченных файлов в один не помогает(
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39691820
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aniskin,

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

А каким образом Вы готовите поток, в котором слиты воедино все тома? Простое слияние упорядоченных файлов в один не помогает(

Только сейчас понял, что я набрехал. Извинюсь за дезинформацию. По теме - есть два варианта реализации разделения zip архива на тома.

Первый - нативный zip-овский вариант. В нем дополнительные тома имеют расширение zNN, каждый том является независимым, имеет сигнатуры и т.д. В этом случае при открытии архива от callback процедуры требуется реализация интерфейса IArchiveOpenVolumeCallback. Черер этот интерфейс zip handler будут запрашивать потоки отдельных томов.

Второй - нативный 7z-овский вариант. В нем дополнительные тома имеют расширение NNN, и тома получаются простым разделением zip архива на куски. В этом случае нужно создавать общий поток, содержащий все тома архива.

(PS Поддержка нативного zip-овского варианта в 7-Zip появилась не сразу, возможно, на момент написания поста ее не было, тогда я не набрехал).
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39691882
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aniskin,

Спасибо за разъяснение!
Судя по Вашему описанию, я имею дело с первым (родным zip'овским) разделением. Из восьми томов отдельно как zip открываются только 4. Соответственно, не такие уж они и независимые (в том смысле, что отдельный том не есть отдельный zip-архив, если я правильно Вас понял).
Вам доводилось сталкиваться с извлечением многотомников с помощью 7z?
Пишу в Delphi 2007, но если есть пример реализации IArchiveOpenVolumeCallback на другом языке, буду и ему очень рад.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39691897
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xJuniorПишу в Delphi 2007, но если есть пример реализации IArchiveOpenVolumeCallback на другом языке, буду и ему очень рад.А чем конкретно проблема состоит? У вас что то уже реализовано или с нуля пишите?
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39691915
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дипломной работе должна быть возможность извлекать пусть не все, но хотя бы основные типы архивов. И я долгое время считал, что уж с zip'ом умею работать. Пока вот на многотомный архив не нарвался.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  iStream := TFileStreamW.Create(AFilePath, fmOpenRead);
  stream7z := T7zStream.Create(iStream);
  archive := CreateInArchive(CLSID_CFormatZip);
  archive.OpenStream(stream7z);

  for iIndex := 0 to archive.NumberOfItems - 1 do
  begin
    ActualTempFile := APathToExtract + archive.ItemPath[iIndex] + archive.ItemName[iIndex];
    NormalizePathFroWin(ActualTempFile);
    if not archive.ItemIsFolder[iIndex] then
    begin
      if not DirectoryExistsW(ExtractFilePathW(ActualTempFile)) then
        if not ForceDirectoriesW(ExtractFilePathW(ActualTempFile)) then
          exit;
      iFileStream := TFileStreamW.Create(ActualTempFile, fmCreate);
      try
        archive.ExtractItem(iIndex, iFileStream, false);
      finally
        FreeAndNil(iFileStream);
      end;
    end;
  end;



Эта конструкция никогда не подводила до недавнего времени((
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39691933
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы используете JclCompression? Тогда в список интерфейсов

Код: pascal
1.
2.
  TJclSevenzipOpenCallback = class(TInterfacedObject, IArchiveOpenCallback,
    ICryptoGetTextPassword, IUnknown)



добавляйте интерфейс IArchiveOpenVolumeCallback и реализуйте его методы. Методов два - в GetStream открывайте том с переданным индексом, в GetProperty (если будет вызываться) возвращайте запрашиваемое свойство последнего открытого тома.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39691971
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, я использую обёртку 7z для Delphi - модуль sevenzip.pas.
В интерфейсах используемого класса уже есть нужный
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39691975
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И даже есть заглушки под его методы.



В целом ваш совет понятен, спасибо, попробую реализовать эти методы.
Просто думал у вас уже имеется готовый код, чтобы "велосипед не изобретать".
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39692331
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aniskin,
Первым вызывается метод GetProperty с PROPID = kpidName. Пробовал по разному передать путь к следующему (второму) тому, передать просто имя файла следующего тома, пробовал передавать путь/имя первого тома - результат всегда один, извлекаются только файлы из первого тома.
А GetStream вообще ни разу не выполняется.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function T7zInArchive.GetProperty(propID: PROPID; var value: OleVariant): HRESULT;
begin
  case propID of
    kpidName:
      begin
        //TPropVariant(value).vt := VT_LPSTR;
        //TPropVariant(value).pszVal := 'E:\TempDel\TempDel.zip.002';
        value := 'E:\TempDel\TempDel.zip.002';
      end;
  else
  end;
  Result := S_OK;
end;

function T7zInArchive.GetStream(const name: PWideChar;
  var inStream: IInStream): HRESULT;
begin
  Result := S_OK;
end;


Может ещё какие-то идеи подкинете? Заранее благодарен...
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39692347
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xJunior,

А работа с 7z принципиальна? или главное - результат? Тогда можете попробовать компонент fwZip от Rouse_
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39692372
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45,
Да, принципиальна. Это мощный инструмент и всё может. Надо просто научиться... Переделывать всё на fwZip не представляется возможным(
Abbrevia, кстати, тоже хорошо справляется с многотомниками.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39692428
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xJuniorAniskin,
Первым вызывается метод GetProperty с PROPID = kpidName. Пробовал по разному передать путь к следующему (второму) тому, передать просто имя файла следующего тома, пробовал передавать путь/имя первого тома - результат всегда один, извлекаются только файлы из первого тома.
А GetStream вообще ни разу не выполняется.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function T7zInArchive.GetProperty(propID: PROPID; var value: OleVariant): HRESULT;
begin
  case propID of
    kpidName:
      begin
        //TPropVariant(value).vt := VT_LPSTR;
        //TPropVariant(value).pszVal := 'E:\TempDel\TempDel.zip.002';
        value := 'E:\TempDel\TempDel.zip.002';
      end;
  else
  end;
  Result := S_OK;
end;


Может ещё какие-то идеи подкинете? Заранее благодарен...

При запросе kpidName нужно отдавать имя того тома, который вы передали изначально в Open. Я лично передаю просто имя без пути. И я не понял, с одной стороны вы говорите, что пытаетесь открыть нативные zip тома, но на практике передаете тома вида TempDel.zip.002, т.е. нативные 7z тома, которые не требуют плясок с IArchiveOpenVolumeCallback.
...
Рейтинг: 0 / 0
Распаковка многотомного ZIP архива
    #39692512
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AniskinИ я не понял, с одной стороны вы говорите, что пытаетесь открыть нативные zip тома, но на практике передаете тома вида TempDel.zip.002, т.е. нативные 7z тома, которые не требуют плясок с IArchiveOpenVolumeCallback.

Хм, я почему-то решил, что механизм сборки томов работает одинаково, как для нативных 7z, так и для нативных zip архивов, т.е. пляски с IArchiveOpenVolumeCallback нужны всегда. Оказалось, что они нужны только для нативных zip-многотомников, как Вы и сказали.
Хорошо, что Вы обратили на это внимание.
Я подготовил нативный zip-многотомник, описал указанные два метода IArchiveOpenVolumeCallback (пока, правда, в примитивном виде), и о чудо, тома подтянулись один за другим! Всё заработало!!! Ура!!!
Огромное Вам спасибо за профессионализм и оперативные подсказки!
Мощь 7z.dll подтвердилась в очередной раз!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Распаковка многотомного ZIP архива
    #39952299
lobbyit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi xJunior,
can you write me the code you write to implement IArchiveOpenVolumeCallback?
I'm using latest sevenzip.pas. Can you send me a diff file or make a pull request on github?
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Распаковка многотомного ZIP архива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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