0

私はもともと GetFileSize() を使用していましたが、それが正しい方法ではないことがわかりました。いくつかの提案をお願いします。

4

2 に答える 2

3

「出力バッファ」の意味は、7zファイルの解凍から圧縮されていないファイルを受け取るために使用されるメモリのチャンクであると思います。ただし、これについては明確ではありません。

一度にすべてを取得するのではなく、可能であれば、出力をストリーミングしてみることをお勧めします。こうすれば、サイズを知る必要がなくなります。標準の 7-Zip LZMA SDK は、これを行うための zlib 互換 API を提供し、ストリーミングの圧縮または解凍を比較的簡単にします。

何らかの理由でこれが不可能な場合は、2 段階で行う必要があります。7z アーカイブ形式では、元のファイル サイズと圧縮サイズが保存されると思います。 question は元のサイズを返す必要があり、それをバッファーとして割り当てることができます。

何らかのソースから実際にパイプしている場合、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.
   } 
} 

ストリーム全体を 1 つのバッファーに集約する必要がある場合は、動的に割り当てられたコンテナー (std::vector、std::string、std::list など) を使用できます。

于 2013-02-05T22:32:40.990 に答える