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

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

Код: 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
03.03.2014, 23:34
    #38577319
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание архива 7zip
недотепа2, FDestinationDir это поле объекта, к нему может получить доступ кто угодно. В частности, InArchive.Extract может захотеть его прочитать. Если не сам, то через AExtractCallback.

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

спасибо!
...
Рейтинг: 0 / 0
02.05.2014, 19:37
    #38631536
stut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание архива 7zip
У меня в 7-zip я пытался загрузить файл в архиве tar.gz. Он сперва превращается в tаr. А потом распаковывает файлы в какую то временую папку на диске C. И не хватает места. Сперва они при повторном запуске архива удалялись а теперь даже после перезагрузки остаются. Проверял папки TEMP они пусты как и файлы которые созданы сегодня. Не видно где они могут быть. И где все таки их искать. Очистители ненужных файлов тоже ничего не дают.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
02.11.2018, 16:30
    #39727311
xJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание архива 7zip
Кто-нибудь пробовал добавлять комментарии к архиву, упаковывая с помощью sevenzip.pas (7z.dll)?
Поделитесь опытом, пожалуйста!
...
Рейтинг: 0 / 0
03.11.2018, 03:00
    #39727490
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание архива 7zip
xJuniorКто-нибудь пробовал добавлять комментарии к архиву, упаковывая с помощью sevenzip.pas (7z.dll)?Упаковка в какой архив?
...
Рейтинг: 0 / 0
06.11.2018, 10:29
    #39728391
xJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание архива 7zip
Aniskin,
Речь про zip-архив
...
Рейтинг: 0 / 0
06.11.2018, 10:46
    #39728401
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание архива 7zip
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание архива 7zip / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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