私は、ストリームとバイト配列を解凍するだけでなく、それらを圧縮する機能が必要なプロジェクトに取り組んでいます。ストリームから Zip を作成してから解凍する単体テストをいくつか実行していましstreamToZip.Seek(o,SeekOrigin.Begin)
たstreamToZip.Flush()
。これを行わないと、「ブロックを読み取れません、データがありません」というエラーが表示されZipFile.Read(stream)
ます。
その理由を誰かが説明できるかどうか疑問に思っていました。実際に相対読み取り位置を設定するためにそれを使用することに関するいくつかの記事を見てきましたが、この状況でそれが必要な理由を実際に説明しているものはありません。
ここに私のコードがあります:
オブジェクトの圧縮:
public Stream ZipObject(Stream data)
{
var output = new MemoryStream();
using (var zip = new ZipFile())
{
zip.AddEntry(Name, data);
zip.Save(output);
FlushStream(output);
ZippedItem = output;
}
return output;
}
オブジェクトの解凍:
public List<Stream> UnZipObject(Stream data)
{
***FlushStream(data); // This is what I had to add in to make it work***
using (var zip = ZipFile.Read(data))
{
foreach (var item in zip)
{
var newStream = new MemoryStream();
item.Extract(newStream);
UnZippedItems.Add(newStream);
}
}
return UnZippedItems;
}
私が追加しなければならなかったフラッシュメソッド:
private static void FlushStream(Stream stream)
{
stream.Seek(0, SeekOrigin.Begin);
stream.Flush();
}