我最初使用 GetFileSize(),然后发现这不是正确的方法。请给我一些建议。
2 回答
我假设您所说的“输出缓冲区”是一块内存,用于从 7z 文件解压缩中接收未压缩文件。不过,您对此并不清楚。
如果可以的话,我鼓励您尝试流式传输输出,而不是一次全部获取。这样你就不必知道尺寸是多少。标准的 7-Zip LZMA SDK 提供了一个与 zlib 兼容的 API,这使得流压缩或解压缩相对容易。
如果由于某种原因这是不可能的,您将不得不分两个阶段进行:我相信 7z 存档格式存储原始文件大小以及压缩大小,因此要求文件的目录条目问题应该返回原始大小,您可以将其分配为缓冲区。
如果您真的是从某个来源进行管道传输,那么您只是看到通过 7z 压缩或解压缩操作传递的字节流,则可能是没有可用的大小信息......您只需要解决这个问题. 但是,您确实说过您尝试过 GetFileSize() ,这表明存在某种文件,因此希望这不是您面临的问题。
HtH
露丝
当你启动一个进程时,你会得到一个输出流(假设你已经重定向了它的标准输出)。处理流的正确方法是逐块读取它,多次读取,直到到达流的末尾。示例代码在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 等。