Получить декомпрессионный поток для файла в Zip-файле - PullRequest
0 голосов
/ 27 августа 2018

Справочная информация: я обрабатываю некоторые файлы журналов, которые заархивированы (я вставляю данные журнала в базу данных).Файлы журналов имеют размер в несколько гигабайт, и было бы неплохо иметь возможность обрабатывать файлы без их извлечения на диск (размер zip-файлов составляет всего несколько сотен мегабайт).У меня это работает для извлеченного файла журнала (используя TStreamReader).

Что я хочу сделать, это получить какой-то поток декомпрессии для одного из файлов в zip-файле и использовать этот поток дляобработать файл журнала без необходимости извлекать весь файл на диск.Поток декомпрессии должен поддерживать файлы размером более 4 ГБ.

TZipFile в system.zip похоже, что он поддерживает это, но я не смог заставить его работать - возможно, потому что он поддерживает только32-битные размеры файлов, и я имею дело с файлами больше этого.У меня также установлена ​​abbrevia, но я не вижу ничего, что позволило бы мне сделать это.

Я использую Delphi XE7 для этого проекта.Обратите внимание, что я не хочу извлекать zip-файл в поток (файлы имеют размер в ГБ и физической памяти недостаточно), но получаю реальный поток распаковки.

1 Ответ

0 голосов
/ 14 сентября 2018

Я использовал стандартный TZipFile в System.Zip и проверил, больше ли внутренний файл, чем 4 ГБ - примерно

VAR
  zipStream       : TStream;
  LocalHeader     : TZipHeader;
  StreamSize      : Int64;
  FileName        : string;
begin
//...
  Zip := TZipFile.Create;
  Zip.Open (FileName, TZipMode.zmRead);
  Zip.Read ('somefile.xml', zipStream, LocalHeader);
  StreamSize := LocalHeader.UncompressedSize;
  if StreamSize = MAXDWORD then
    ShowMessage ('File is too large, only the first 4GB will be processed'#10'To process entire file you must extract .xml file manually');
//process zipStream...
end;

Не идеально, но все же полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...