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

Есть очень важная задача программно распаковать многотомный архив. Количество томов может быть разным.
Пользуюсь версией 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
20.01.2016, 14:12
    #39151468
NapalmRain
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка многотомного ZIP архива
При этом с однотомными архивами никакой проблемы нет ни стандартным функционалом, ни 7z
...
Рейтинг: 0 / 0
20.01.2016, 14:54
    #39151526
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка многотомного ZIP архива
NapalmRain,

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

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

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

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

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

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

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

В ресурсы можно вшить хоть слона. Во время работы достаешь из ресурсов необходимый тебе exe во временную папочку, запускаешь, ждешь пока отработает, удаляешь.
...
Рейтинг: 0 / 0
20.01.2016, 16:17
    #39151612
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка многотомного ZIP архива
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
20.01.2016, 16:33
    #39151633
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка многотомного ZIP архива
Если у вас есть БД, то можно воткнуть туда.
У меня так сделано обновление проги. Прога зырит в БД и видит дату файла. Сравнивает и сигналит если надо обновлять.
Жмем "Обновить".
Файлик вытаскивается из базы и копируется рядом. Потом передается управление прожечке, кот. скопирует новый файл поверх старого.
Основная прога закрывается, прожечка меняет файлик и запускает его.
На все менее 5сек.

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

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

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

сейчас обертка над 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
21.01.2016, 18:06
    #39152548
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка многотомного ZIP архива
qwertEHOK,

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

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

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

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

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

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

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

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

Not Supported format обозначает, что ты передаешь несоответствующий тип архива в распаковщик. Например, передаешь zip архив в распаковщик 7z, или наоборот.
...
Рейтинг: 0 / 0
22.01.2016, 17:02
    #39153243
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка многотомного ZIP архива
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
23.01.2016, 15:42
    #39153639
NapalmRain
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка многотомного ZIP архива
DarkMaster,

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


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


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