如何在C ++中为7zip命令行输出创建精确的输出缓冲区?

时间:2013-02-05 21:45:04

标签: c++ visual-c++ 7zip

我最初使用GetFileSize()然后发现这不是正确的方法。请给我一些建议。

2 个答案:

答案 0 :(得分:3)

我假设“输出缓冲区”的含义是用于从7z文件解压缩接收未压缩文件的一块内存。你不清楚这一点。

如果可以的话,我会鼓励你尝试输出输出,而不是一次性全部抓取。这样你就不必知道它的大小。标准的7-Zip LZMA SDK提供了一个兼容zlib的API,可以使流压缩或解压缩相对容易。

如果出于某种原因这是不可能的,则必须分两个阶段进行:我相信7z存档格式存储原始文件大小以及压缩大小,因此要求输入目录有问题的文件应返回原始大小,您可以将其分配为缓冲区。

如果你真的是来自某个来源的管道,所以你只是看到通过7z压缩或解压缩动作传递的字节流,可能的是没有可用的大小信息......你只需要解决这个问题。但是,你确实说过你尝试过GetFileSize(),这表明存在某种文件,所以希望这不是你面临的问题。

HTH

露丝

答案 1 :(得分:1)

启动进程时,您将获得一个输出流(假设您已重定向其标准输出)。处理流的一种正确方法是通过块读取它,多次,直到到达流的末尾。示例代码在MSDN page上 - 查找函数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等。