我最初使用GetFileSize()然后发现这不是正确的方法。请给我一些建议。
答案 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等。