Compression.DeflateStreamを使用してストリームを圧縮および解凍しようとしています。以下のコードは私のストリームを110バイトの長さの配列に圧縮するので、圧縮は正しく動作しているようです。ただし、圧縮解除されたStreamを読み取ると、空の文字列が返されます。Compression.DeflateStreamでストリームを圧縮および解凍
class Program
{
static void Main(string[] args)
{
// Compress a random string value
string value = Path.GetRandomFileName();
byte[] compressedBytes;
using (var writer = new StreamWriter(new MemoryStream()))
{
writer.Write(value);
writer.Flush();
writer.BaseStream.Position = 0;
compressedBytes = Compress(writer.BaseStream);
}
// Decompress compressed bytes
Stream decompressedStream = Decompress(compressedBytes);
// here already applies: decompressedStream.Length == 0
using (var reader = new StreamReader(decompressedStream))
{
string decompressedValue = reader.ReadToEnd();
if (value == decompressedValue)
Console.WriteLine("Success");
else
Console.WriteLine("Failed");
}
}
private static byte[] Compress(Stream input)
{
using (var compressStream = new MemoryStream())
using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
{
input.CopyTo(compressor);
return compressStream.ToArray();
}
}
private static Stream Decompress(byte[] input)
{
var output = new MemoryStream();
using (var compressStream = new MemoryStream(input))
using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress))
decompressor.CopyTo(output);
output.Position = 0;
return output;
}
}
誰でも私にこのことを教えてもらえますか? 多くのありがとうございます。
これは機能します。多くのありがとう – greijner
'Close'ではなく' Flush'を呼び出すと動作しません。内部的に 'Flush'を呼び出す' Close'はこれがなぜ機能するのかと思っていました。 –
@Luke:[DeflateStream.Flush() 'のドキュメント](https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.flush(v = vs.110) .aspx):_ "このメソッドの現在の実装は、内部バッファをフラッシュしません。オブジェクトが破棄されると内部バッファがフラッシュされます。" _これがデザインである理由について、 'Stream.Flush()'は内部バッファリングをフラッシュしますが、デフレートされたストリームは_end_にあることがわかるまでファイナライズすることはできません。これはストリームが閉じられたときにのみ可能です。 –