Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

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

Эх пичалько... Я вот тут прорабатываю пример
Код:
 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 в 14:02.
Stilet вне форума Ответить с цитированием
Старый 05.06.2015, 20:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Все! Разрулил ситуацию. Оказывается что 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, 08:32   #5
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Skype API Добавление контактов bilibian Общие вопросы Delphi 13 04.11.2014 21: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