powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание архива 7zip
9 сообщений из 9, страница 1 из 1
Создание архива 7zip
    #38577285
недотепа2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понимаю что изжевано. Но я хочу понять что же всетаки происходит:

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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;


Никем не наследуется, и вуаля:
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
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(InArchive.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? Кто его читает и где?
...
Рейтинг: 0 / 0
Создание архива 7zip
    #38577319
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
недотепа2, FDestinationDir это поле объекта, к нему может получить доступ кто угодно. В частности, InArchive.Extract может захотеть его прочитать. Если не сам, то через AExtractCallback.

Ежели в текущем коде FDestinationDir никто не трогает, то это значит, что либо код был удалён, либо это задел на будущее.
...
Рейтинг: 0 / 0
Создание архива 7zip
    #38577323
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Взгляд в сырцы подсказывает, что InArchive.Extract дёргает AExtractCallback, AExtractCallback в GetStream дёргает TJclDecompressItem.ValidateExtraction, который дёргает TJclDecompressArchive.ValidateExtraction, который и обращается к FDestinationDir.
...
Рейтинг: 0 / 0
Создание архива 7zip
    #38579544
недотепа2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker,

спасибо!
...
Рейтинг: 0 / 0
Создание архива 7zip
    #38631536
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня в 7-zip я пытался загрузить файл в архиве tar.gz. Он сперва превращается в tаr. А потом распаковывает файлы в какую то временую папку на диске C. И не хватает места. Сперва они при повторном запуске архива удалялись а теперь даже после перезагрузки остаются. Проверял папки TEMP они пусты как и файлы которые созданы сегодня. Не видно где они могут быть. И где все таки их искать. Очистители ненужных файлов тоже ничего не дают.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Создание архива 7zip
    #39727311
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нибудь пробовал добавлять комментарии к архиву, упаковывая с помощью sevenzip.pas (7z.dll)?
Поделитесь опытом, пожалуйста!
...
Рейтинг: 0 / 0
Создание архива 7zip
    #39727490
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xJuniorКто-нибудь пробовал добавлять комментарии к архиву, упаковывая с помощью sevenzip.pas (7z.dll)?Упаковка в какой архив?
...
Рейтинг: 0 / 0
Создание архива 7zip
    #39728391
xJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aniskin,
Речь про zip-архив
...
Рейтинг: 0 / 0
Создание архива 7zip
    #39728401
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xJuniorzip

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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;
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание архива 7zip
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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