Ich versuche, einen Stream unter Verwendung Compression.DeflateStream zu komprimieren und dekomprimieren. Das Komprimieren scheint korrekt zu funktionieren, da der folgende Code meinen Stream auf ein 110 Bytes langes Array komprimiert. Das Lesen des dekomprimierten Streams führt jedoch zu einer leeren Zeichenfolge.Komprimieren und dekomprimieren Sie einen Stream mit 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;
}
}
Kann mir jemand dabei helfen? Vielen Dank.
Dies funktioniert. Vielen Dank – greijner
Muss rufen Sie, dass wenn Sie 'Flush' statt' Close' aufrufen, es nicht funktioniert. Ich dachte, 'Close' nennt' Flush' intern, warum das funktioniert, aber nein. –
@Luke: aus [die Dokumentation für 'DeflateStream.Flush()'] (https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.flush (v = vs.110) .aspx): _ "Die aktuelle Implementierung dieser Methode löscht den internen Puffer nicht. Der interne Puffer wird geleert, wenn das Objekt entfernt wird." _ Warum dies der Entwurf ist, ist "Stream.Flush()" beabsichtigt Flush internes Buffering, aber ein Deflate-Stream kann nicht finalisiert werden, bis er weiß, dass Sie sich am _end_ befinden, was nur möglich ist, wenn der Stream _closed_ ist. –