Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Создание архива 7zip  [new]
недотепа2
Guest
Понимаю что изжевано. Но я хочу понять что же всетаки происходит:

Объявлен интерфейс:

IInArchive = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600600000}']
    function Open(Stream: IInStream; MaxCheckStartPosition: PInt64;
       OpenArchiveCallback: IArchiveOpenCallback): HRESULT; stdcall;
    function Close: HRESULT; stdcall;
    function GetNumberOfItems(NumItems: PCardinal): HRESULT; stdcall;
    function GetProperty(Index: Cardinal; PropID: TPropID;
      var Value: TPropVariant): HRESULT; stdcall;
    function Extract(Indices: PCardinal; NumItems: Cardinal;
      TestMode: Integer; ExtractCallback: IArchiveExtractCallback): HRESULT; stdcall;
    // indices must be sorted
    // numItems = 0xFFFFFFFF means all files
    // testMode != 0 means "test files operation"
    function GetArchiveProperty(PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;

    function GetNumberOfProperties(NumProperties: PCardinal): HRESULT; stdcall;
    function GetPropertyInfo(Index: Cardinal; out Name: TBStr; out PropID: TPropID;
      out VarType: TVarType): HRESULT; stdcall;

    function GetNumberOfArchiveProperties(NumProperties: PCardinal): HRESULT; stdcall;
    function GetArchivePropertyInfo(Index: Cardinal; out Name: TBStr; out PropID: TPropID;
      out VarType: TVarType): HRESULT; stdcall;
  end;

Никем не наследуется, и вуаля:
procedure TJclSevenzipDecompressArchive.ExtractAll(const ADestinationDir: string;
  AAutoCreateSubDir: Boolean);
var
  AExtractCallback: IArchiveExtractCallback;
  Indices: array of Cardinal;
  NbIndices: Cardinal;
  Index: Integer;
begin
  CheckNotDecompressing;

  FDestinationDir := ADestinationDir;
  FAutoCreateSubDir := AAutoCreateSubDir;

  if FDestinationDir <> '' then
    FDestinationDir := PathAddSeparator(FDestinationDir);

  FDecompressing := True;
  FExtractingAllIndex := 0;
  AExtractCallback := TJclSevenzipExtractCallback.Create(Self);
  try
    OpenArchive;

    // seems buggy: first param "indices" is dereferenced without
    // liveness checks inside Sevenzip code
    //SevenzipCheck(InArchive.Extract(nil, $FFFFFFFF, 0, AExtractCallback));

    NbIndices := ItemCount;
    SetLength(Indices, NbIndices);
    for Index := 0 to NbIndices - 1 do
    begin
      Items[Index].Selected := True;
      Indices[Index] := Index;
    end;
    SevenzipCheck([b]InArchive[/b].Extract(@Indices[0], NbIndices, 0, AExtractCallback));

    CheckOperationSuccess;
  finally
    FDestinationDir := '';
    FDecompressing := False;
    FExtractingAllIndex := -1;
    FCurrentItemIndex := -1;
    AExtractCallback := nil;
    // release volumes and other finalizations
    inherited ExtractAll(ADestinationDir, AAutoCreateSubDir);
  end;
end;


Вопрос: куда передается параметр DestinationDir? Кто его читает и где?
3 мар 14, 22:09    [15666049]     Ответить | Цитировать Сообщить модератору
 Re: Создание архива 7zip  [new]
GunSmoker
Member

Откуда:
Сообщений: 3081
недотепа2, FDestinationDir это поле объекта, к нему может получить доступ кто угодно. В частности, InArchive.Extract может захотеть его прочитать. Если не сам, то через AExtractCallback.

Ежели в текущем коде FDestinationDir никто не трогает, то это значит, что либо код был удалён, либо это задел на будущее.
3 мар 14, 23:34    [15666487]     Ответить | Цитировать Сообщить модератору
 Re: Создание архива 7zip  [new]
GunSmoker
Member

Откуда:
Сообщений: 3081
P.S. Взгляд в сырцы подсказывает, что InArchive.Extract дёргает AExtractCallback, AExtractCallback в GetStream дёргает TJclDecompressItem.ValidateExtraction, который дёргает TJclDecompressArchive.ValidateExtraction, который и обращается к FDestinationDir.
3 мар 14, 23:38    [15666505]     Ответить | Цитировать Сообщить модератору
 Re: Создание архива 7zip  [new]
недотепа2
Guest
GunSmoker,

спасибо!
5 мар 14, 21:51    [15679753]     Ответить | Цитировать Сообщить модератору
 Re: Создание архива 7zip  [new]
stut
Member

Откуда:
Сообщений: 491
У меня в 7-zip я пытался загрузить файл в архиве tar.gz. Он сперва превращается в tаr. А потом распаковывает файлы в какую то временую папку на диске C. И не хватает места. Сперва они при повторном запуске архива удалялись а теперь даже после перезагрузки остаются. Проверял папки TEMP они пусты как и файлы которые созданы сегодня. Не видно где они могут быть. И где все таки их искать. Очистители ненужных файлов тоже ничего не дают.
2 май 14, 19:37    [15964438]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Создание архива 7zip  [new]
xJunior
Member

Откуда:
Сообщений: 11
Кто-нибудь пробовал добавлять комментарии к архиву, упаковывая с помощью sevenzip.pas (7z.dll)?
Поделитесь опытом, пожалуйста!
2 ноя 18, 16:30    [21722660]     Ответить | Цитировать Сообщить модератору
 Re: Создание архива 7zip  [new]
Aniskin
Member

Откуда:
Сообщений: 303
xJunior
Кто-нибудь пробовал добавлять комментарии к архиву, упаковывая с помощью sevenzip.pas (7z.dll)?
Упаковка в какой архив?
3 ноя 18, 03:00    [21723129]     Ответить | Цитировать Сообщить модератору
 Re: Создание архива 7zip  [new]
xJunior
Member

Откуда:
Сообщений: 11
Aniskin,
Речь про zip-архив
6 ноя 18, 10:29    [21724927]     Ответить | Цитировать Сообщить модератору
 Re: Создание архива 7zip  [new]
Aniskin
Member

Откуда:
Сообщений: 303
xJunior
zip


7z.dll api не поддерживает запись в zip-архив комментария для архива. Поэтому я использую небольшой хак. После создания того, как 7z.dll создала архив я вызываю такой код:

procedure SaveCommentToZipStream(AStream: IStream; const AComment: AnsiString);
var
  NewPos: Int64;
  CommentSize: Word;
  Processed: Cardinal;
begin
  if Assigned(AStream) and (AComment <> '') then
    try
      OleCheck(AStream.Seek(-2, STREAM_SEEK_END, NewPos));
      OleCheck(AStream.Read(@CommentSize, SizeOf(CommentSize), @Processed));
      if (Processed = SizeOf(CommentSize)) and (CommentSize = 0) then
        begin
          OleCheck(AStream.Seek(-2, STREAM_SEEK_END, NewPos));
          CommentSize := Length(AComment);
          OleCheck(AStream.Write(@CommentSize, SizeOf(CommentSize), @Processed));
          OleCheck(AStream.Write(PAnsiChar(AComment), CommentSize, @Processed));
        end;
    except
    end;
end;
6 ноя 18, 10:46    [21724952]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить