0

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

4

2 回答 2

3

我假设您所说的“输出缓冲区”是一块内存,用于从 7z 文件解压缩中接收未压缩文件。不过,您对此并不清楚。

如果可以的话,我鼓励您尝试流式传输输出,而不是一次全部获取。这样你就不必知道尺寸是多少。标准的 7-Zip LZMA SDK 提供了一个与 zlib 兼容的 API,这使得流压缩或解压缩相对容易。

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

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

HtH

露丝

于 2013-02-05T22:24:20.210 回答
1

当你启动一个进程时,你会得到一个输出流(假设你已经重定向了它的标准输出)。处理流的正确方法是逐块读取它,多次读取,直到到达流的末尾。示例代码在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 等。

于 2013-02-05T22:32:40.990 回答