С получением вывода из консоли после распаковки ВСЕХ файлов, проблем не возникает (делаю почти всё как в последнем примере – "чтение больших объёмов вывода" – из Lazarus Wiki - http://wiki.lazarus.freepascal.org/Executing_External_Programs/ru).
Код:
- Код: Выделить всё
max_l:=1024;
try
P.CommandLine:=Utf8toSys(7z e file.rar -oC:\tmp -y);
P.Options := [poUsePipes, poNoConsole];
P.Execute;
while P.Running do begin
if P.output.NumBytesAvailable>0 then begin
M.SetSize(BytesRead + max_l);
i := P.Output.Read((M.Memory + BytesRead)^, max_l);
end else i:=0;
if i > 0 then begin //это не выполняется
Inc(BytesRead, i);
M.SetSize(BytesRead);
Form1.Mm_main.Lines.Add('...');
Application.ProcessMessages;
end
else Sleep(100);
end;
if Form1.Visible=true then Application.ProcessMessages;
Result :=P.ExitStatus;
finally
P.Free;
M.Free;
Но ВО ВРЕМЯ распаковки ничего получить не могу (NumBytesAvailable = 0). В чём может быть проблема?
Сейчас для демонстрации процесса распаковки приходится запускать на таймере проверку количества файлов в директории, куда распаковываются файлы. До этого получаю от 7zip количество файлов в архиве (команда 7z l archive.zip). Выглядит как-то не красиво поэтому решил попробовать по-другому, но не выходит...