Первоначально я использовал GetFileSize (), а затем обнаружил, что это не правильный путь. Пожалуйста, дайте мне несколько предложений.
Когда вы запускаете процесс, вы получите поток вывода (при условии, что вы перенаправили его стандартный вывод). Правильный способ работы с потоками — это читать его по частям, несколько раз, пока вы не достигнете конца потока. Пример кода включен Страница 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 и т. д.
Я предполагаю, что вы подразумеваете под «буфером вывода» — это кусок памяти, используемый для получения несжатого файла из файла 7z для распаковки. Вы не ясно по этому вопросу, хотя.
Я бы посоветовал вам попробовать потоковую передачу, если вы можете, а не захватывать все сразу. Таким образом, вам не нужно будет знать, какой размер. Стандартный 7-Zip LZMA SDK предоставляет zlib-совместимый API для этого, что делает относительно легким потоковое сжатие или распаковку.
Если по какой-либо причине это невозможно, вам придется сделать это в два этапа: я полагаю, что формат архива 7z хранит как исходный размер файла, так и сжатый размер, поэтому запрашивает запись таблицы содержания для файла в Вопрос должен вернуть исходный размер, и вы можете выделить его в качестве буфера.
Если вы действительно работаете по трубопроводу из какого-то источника, и вы просто видите поток байтов, проходящий через действие сжатия или распаковки 7z, скорее всего, информация о размере не доступна … и вам просто придется обойти это. , Тем не менее, вы сказали, что пробовали GetFileSize (), который предполагает наличие какого-то файла, так что, надеюсь, это не проблема, с которой вы сталкиваетесь.
HtH
Рут