Estoy tratando de comprimir y descomprimir un Stream usando Compression.DeflateStream. La compresión parece funcionar correctamente, ya que el siguiente código comprime mi Stream a una matriz de 110 bytes de longitud. Sin embargo, leer los resultados de Stream descomprimidos es una cadena vacía.Comprimir y descomprimir un Stream con 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;
}
}
¿Alguien me puede ayudar en esto? Muchas gracias.
Esto funciona. Muchas gracias – greijner
Debe decir que si llama 'Flush' en lugar de' Close' no funciona. Pensé que 'Close' llamar' Flush' internamente era la razón por la que funciona, pero no. –
@Luke: de [la documentación para 'DeflateStream.Flush()'] (https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.flush (v = vs.110) .aspx): _ "La implementación actual de este método no vacía el búfer interno. El búfer interno se vacía cuando se elimina el objeto." _ En cuanto a por qué este es el diseño, 'Stream.Flush()' está destinado a descargue el búfer interno, pero una secuencia desinflada no se puede finalizar hasta que sepa que está en el _end_, que solo es posible cuando la secuencia está cerrada. –