7
votes

L'écriture sur le flux de compression n'est pas prise en charge. En utilisant system.io.gzipstream

Je reçois une exception lorsque vous essayez de décompresser un fichier (.gz) à l'aide de la classe Gzipstream incluse dans le document .NET. J'utilise la documentation MSDN. C'est l'exception:

L'écriture sur le flux de compression n'est pas prise en charge. P> BlockQuote>

Voici la source d'application: P>

 try
 {
     var infile = new FileStream(@"C:\TarDecomp\TarDecomp\TarDecomp\bin\Debug\nick_blah-2008.tar.gz", FileMode.Open, FileAccess.Read, FileShare.Read);
     byte[] buffer = new byte[infile.Length];
     // Read the file to ensure it is readable.
     int count = infile.Read(buffer, 0, buffer.Length);
     if (count != buffer.Length)
     {
         infile.Close();
         Console.WriteLine("Test Failed: Unable to read data from file");
         return;
     }
     infile.Close();
     MemoryStream ms = new MemoryStream();
     // Use the newly created memory stream for the compressed data.
     GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress, true);
     Console.WriteLine("Decompression");
     compressedzipStream.Write(buffer, 0, buffer.Length); //<<Throws error here
     // Close the stream.
     compressedzipStream.Close();
     Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length, ms.Length);
} catch {...}


0 commentaires

3 Réponses :


16
votes

Il vous dit que vous devriez appeler lire au lieu de écrire car sa décompression! De plus, le flux de mémoire doit être construit avec les données, ou plutôt que vous devriez passer le flux de fichiers directement au constructeur Gzipstream.

Exemple de la façon dont il aurait dû être fait (n'a pas essayé de le compiler): xxx


0 commentaires

1
votes

Comment les flux de compression fonctionnent peuvent être déroutants au début.

lecture prend compressé les données et l'écriture prend données non compressées . Dans l'ensemble, le flux vous garantit uniquement des données non compressées à tout moment.

La bonne façon de réaliser ce que vous essayez de faire, c'est lire en utilisant l'utilisation de gzipstream , puis écrivez à l'aide du gzipstream aussi.


0 commentaires

9
votes

Le code de compression ne fonctionne pas comme le cryptage - vous ne pouvez pas décompresser d'un flux à un autre en écrivant les données comprimées. Vous devez fournir un flux contenant déjà les données compressées et laissez-la gzipstream en lecture. Quelque chose comme ceci: xxx

copystream est une méthode d'utilité simple à lire à partir d'un flux et de copier toutes les données à une autre. Quelque chose comme ceci: xxx


0 commentaires