Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 05.06.2015, 13:45   #1
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,842
Репутация: 6832
По умолчанию 7Z API. Добавление к существующему архиву.

Всем доброго времени.
Использую I7zOutArchive интерфейс для создания архива.
Если архив такой уже есть то он перезаписывается, а мне нужно дописывать к уже существующему.
Пока я рою интернет в поисках ответа, может кто тут работал с этим архиватором и подскажет какие функции нужно использовать для этого.

Заранее спасибо.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 05.06.2015, 14:21   #2
Vapaamies
Ваш К. О.
Профессионал
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Адрес: Санкт-Петербург
Сообщений: 1,677
Репутация: 973
По умолчанию

А никак, похоже. В интерфейсе I7zOutArchive обновление попросту не реализовано. Может быть и так, что этот код написан очень давно, когда 7-Zip еще не умел обновлять архивы 7z. Некоторое время назад он еще не умел обновлять непрерывные архивы 7z, теперь научился, а обновить код SevenZip.pas некому.
__________________
Разработчик языка программирования Кантор
Vapaamies вне форума   Ответить с цитированием
Старый 05.06.2015, 14:43   #3
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,842
Репутация: 6832
По умолчанию

Эх пичалько... Я вот тут прорабатываю пример
Код:

 var   Arch: I7zOutArchive; 
begin   Arch := CreateOutArchive(CLSID_CFormat7z);   // add a file   
Arch.AddFile('c:\test.bin', 'folder\test.bin');   // add files using willcards and recursive search   
Arch.AddFiles('c:\test', 'folder', '*.pas;*.dfm', true);   // add a stream   
Arch.AddStream(aStream, soReference, faArchive, CurrentFileTime, CurrentFileTime, 'folder\test.bin', false, false);   // compression level   
SetCompressionLevel(Arch, 5);   // compression method if <> LZMA   
SevenZipSetCompressionMethod(Arch, m7BZip2);   // add a progress bar ...   
Arch.SetProgressCallback(...);   // set a password if necessary   
Arch.SetPassword('password');   // Save to file  
 Arch.SaveToFile('c:\test.zip');   // or a stream   Arch.SaveToStream(aStream); 
end;

Это из самого хелпа по нему.
Вот подумал что надо выгружать данные архива в стрим, и из стрима вписывать в новый архив + новые файлы. Но на сохранении выдает ошибку External SIGILL.
Прям хоть в Элохиму обращайся...


P.S. Вот все прекрасно сработало:
Код:

var zipOut:I7zOutArchive; zipIn:I7zInArchive; ms:TMemoryStream;  i:integer; fn:UnicodeString;
begin
  zipIn:=CreateInArchive(CLSID_CFormatZip);
  zipOut:=CreateOutArchive(CLSID_CFormatZip);
  ms:=TMemoryStream.Create;
  zipIn.OpenFile('547_d7zipv1.2.zip');
  for i:=0 to zipIn.NumberOfItems-1 do begin
     ms.Clear;
     zipIn.ExtractItem(i,ms,false);
     ms.Position:=0;
     fn:=zipin.GetItemPath(i);
     zipOut.AddStream(ms,soReference,faArchive,CurrentFileTime,CurrentFileTime,'fold/'+fn,false,false);
  end;
  zipOut.AddFile('unit1.pas','fold2/unit1.pas');

  zipOut.SaveToFile('q.zip');
  zipOut:=nil;
  zipIn:=nil;
  ms.Free;


end;

А в другом проекте облом...
Значит умеет он такие вещи делать без проблем, а видимо что-то не учитываю я...
__________________
I'm learning to live...

Последний раз редактировалось Stilet; 05.06.2015 в 15:02.
Stilet вне форума   Ответить с цитированием
Старый 05.06.2015, 21:30   #4
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,842
Репутация: 6832
По умолчанию

Все! Разрулил ситуацию. Оказывается что AddStream на самом деле не копирует переданный ему поток, а просто учитывает его ссылку. А копирование происходить только при сохранении, соответственно если между AddStream и SaveToFile я освобождаю переменку, которая передана в качестве потока, архиватор не может ее использовать. Т.е. чтоб перезапаковать 7зипом нужно поступать так:
Код:

var Arch:I7zOutArchive; streams:TObjectList; ms:TMemoryStream;
    archOpen:I7zInArchive;
    mspath:UnicodeString;subdir,archName:string;  sz,i:integer;
begin

   Arch := CreateOutArchive(zClass);
//Помещаем в список паковки некие файлы
   Arch.AddFiles('*.txt','text\','',true);

//Создаем массив потоков, в который будем извлекать то, что уже находится в архиве
    streams:=TObjectList.create(true);
//Открываем архив
    archOpen:=CreateInArchive(zClass);
    archOpen.OpenFile(too+'.'+zipClass);
//Извлекаем из него каждый элемент-файл в ОТДЕЛЬНЫЙ, бляха-муха поток
    for i:=0 to archOpen.NumberOfItems-1 do begin
     ms:=TMemoryStream(streams[streams.Add(TMemoryStream.Create)]);
     archOpen.ExtractItem(i,ms,false); ms.Position:=0;

     IsFold:=archOpen.GetItemIsFolder(i);
     mspath:=archOpen.GetItemPath(i);
//И передаем в список пакуемого поток, который запомнится ссылкой
     Arch.AddStream(ms,soReference,faArchive,CurrentFileTime,CurrentFileTime,mspath,IsFold,True);
//Архив закрываем
    archOpen.Close;
//И пересохраняем все перепакованное из извлеченного и новое
     Arch.SaveToFile(too+'.'+zipClass);

   Arch:=nil;
   archOpen:=nil;
//И только потом чьерт побьери освобождаем потоки,
//Которые хранят то. что было упаковано
   if streams<>nil then streams.Free;

end;

Неудобно, ппц... Ну да ладно. Дареному коню в зубы не смотрят.
Пополню Алиску возможность обновления массива зато. Хоть как-нибудь

P.S. Кстати, тема для потомков. Вдруг кто еще будет работать с этим архиватором.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 03.08.2016, 09:32   #5
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
Репутация: 44
По умолчанию

Спасибо! Весь мозг сломал пока тему не нашел!
lollollollol вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Skype API Добавление контактов bilibian Общие вопросы Delphi 13 04.11.2014 22:40
api vkontakte добавление аудиозаписи в плейлист на соц. сети вконтакте Vistar Свободное общение 0 03.06.2011 18:28
Добавление текста к существующему файлу nusik Общие вопросы C/C++ 6 30.07.2009 15:50
запрос на проверку пароля к RAR архиву delphi7 Помощь студентам 7 19.07.2009 22:41


01:24.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru