2010-10-20 19 views
2

J'utilise la classe .Net GZipStream pour compresser et décompresser des fichiers. Après avoir fait la décompression, les données semblent correctes, mais elles ne tournent plus qu'à des zéros après un certain point apparemment arbitraire. Par exemple, après la décompression d'un fichier, la taille correcte est de 19 Ko, mais les octets 10 588 et les zéros sont tous des zéros.La décompression GZip s'arrête à un point arbitraire

Je ne suis pas sûr de ce que je fais incorrectement.

Voilà comment je fais la compression:

Byte[] bytes = GetFileBytes(file); 

using (FileStream fileStream = new FileStream("Zipped.gz", FileMode.Create)) 
{ 
    using (GZipStream zipStream = new GZipStream(fileStream, CompressionMode.Compress)) 
    { 
     zipStream.Write(bytes, 0, bytes.Length); 
    } 
} 

Et voilà comment je fais la décompression (octets est le tableau d'octets compressés et OriginalSize est la taille du fichier avant qu'il ne soit compressé):

using (MemoryStream memoryStream = new MemoryStream(Bytes)) 
{ 
    using (GZipStream zipStream = new GZipStream(memoryStream, CompressionMode.Decompress)) 
    { 
     // Note: Since the compressed version can be larger, I use the larger of the original and the compressed size for the decompressed array's size. 
     Byte[] decompressedBytes = new Byte[OriginalSize > Bytes.Length ? OriginalSize : Bytes.Length]; 

     Int32 numRead = zipStream.Read(decompressedBytes, 0, Bytes.Length); 

     using (FileStream fileStream = new FileStream("Decompressed.txt", Name), FileMode.Create)) 
     { 
      fileStream.Write(decompressedBytes, 0, Convert.ToInt32(OriginalSize)); 
     } 
    } 
} 
+0

Savez-vous si c'est dans la décompression ou la compression - vous pouvez vérifier cela en décompressant/compressant le fichier à la main en utilisant gzip. –

Répondre

3

Je vois une erreur potentielle ici: vous faites des suppositions! :) Vous devez utiliser une boucle lors de la copie entre les flux, voir this question

+0

Hm, nope :) Jetez un coup d'oeil à ce lien à nouveau :) (Vous pourriez même utiliser les méthodes là-bas, c'est plus facile) – Onkelborg