4

DotNetZip には、解決策が見つからないように見える奇妙な問題があります。数時間検索しましたが、何も見つかりませんでした。

var ms = new MemoryStream();
using (var archive = new Ionic.Zip.ZipFile()) {
    foreach (var file in files) {
        //                                string     byte[]
        var entry = archive.AddEntry(file.Name, file.Data);
        entry.ModifiedTime = DateTime.Now.AddYears(10); // Just for testing
    }
    archive.Save(ms);
}
return ms.GetBuffer();

かなり重要な変更時刻を追加する必要がありますが、現在はダミーのタイムスタンプしかありません。

WinRAR でファイルを開くと、「予期しないアーカイブの終了」と表示されます。個々のファイルのチェックサムは 00000000 で、WinRAR は「アーカイブの形式が不明であるか破損しています」と表示します。修理できます。これにより、サイズが 20% 小さくなり、すべてが正常になります。しかし、それは本当に役に立ちません..

zip.Entriesすべてのエントリを追加した後にブレークポイントを作成すると、すべてのエントリに同じ不正な CRC があることがわかりますが、すべてのデータはそこにあるように見えます。したがって、アーカイブを保存する方法が問題であってはなりません。

ファイル コレクションを別の場所で問題なく使用しているため、DotNetZip が奇妙になっています。それか、私が何かを誤解しています:)

4

1 に答える 1

6

GetBuffer確かに間違っています。の内部バッファを返しますMemoryStream。これは多くの場合、実際のコンテンツよりも大きくなります。

実際のコンテンツのみを含む配列を返すには、を使用しますToArray()

または、消費するコードで不完全に満たされたバッファーを注意深く処理することもできます。これにより、戻り値にまったく新しい配列を割り当てる必要がなくなるため、GCの圧力が軽減されます。

zipアーカイブが大きい場合は、アーカイブをメモリ内にアセンブルするのではなく、ファイルに直接保存することも検討します。

于 2012-04-24T07:09:30.503 に答える