Как я могу создать точный буфер вывода в C ++ для вывода из командной строки 7zip?

Первоначально я использовал GetFileSize (), а затем обнаружил, что это не правильный путь. Пожалуйста, дайте мне несколько предложений.

0

Решение

Когда вы запускаете процесс, вы получите поток вывода (при условии, что вы перенаправили его стандартный вывод). Правильный способ работы с потоками — это читать его по частям, несколько раз, пока вы не достигнете конца потока. Пример кода включен Страница MSDN — ищите функцию ReadFromPipe (void). Вот копия кода:

void ReadFromPipe(void)

// Read output from the child process's pipe for STDOUT
// and write to the parent process's pipe for STDOUT.
// Stop when there is no more data.
{
DWORD dwRead, dwWritten;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

for (;;)
{
bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if( ! bSuccess || dwRead == 0 ) break;

// ... -> do your processing here.
}
}

Если вам нужно объединить весь поток в один буфер, вы можете использовать динамически распределяемые контейнеры, например, std :: vector, std :: string, std :: list и т. д.

1

Другие решения

Я предполагаю, что вы подразумеваете под «буфером вывода» — это кусок памяти, используемый для получения несжатого файла из файла 7z для распаковки. Вы не ясно по этому вопросу, хотя.

Я бы посоветовал вам попробовать потоковую передачу, если вы можете, а не захватывать все сразу. Таким образом, вам не нужно будет знать, какой размер. Стандартный 7-Zip LZMA SDK предоставляет zlib-совместимый API для этого, что делает относительно легким потоковое сжатие или распаковку.

Если по какой-либо причине это невозможно, вам придется сделать это в два этапа: я полагаю, что формат архива 7z хранит как исходный размер файла, так и сжатый размер, поэтому запрашивает запись таблицы содержания для файла в Вопрос должен вернуть исходный размер, и вы можете выделить его в качестве буфера.

Если вы действительно работаете по трубопроводу из какого-то источника, и вы просто видите поток байтов, проходящий через действие сжатия или распаковки 7z, скорее всего, информация о размере не доступна … и вам просто придется обойти это. , Тем не менее, вы сказали, что пробовали GetFileSize (), который предполагает наличие какого-то файла, так что, надеюсь, это не проблема, с которой вы сталкиваетесь.

HtH

Рут

3