tags:

views:

73

answers:

3

I have some code that downloads gzipped files, and decompresses them. The problem is, I can't get it to decompress the whole file, it only reads the first 4096 bytes and then about 500 more.

Byte[] buffer = new Byte[4096];
int count = 0;
FileStream fileInput = new FileStream("input.gzip", FileMode.Open, FileAccess.Read, FileShare.Read);
FileStream fileOutput = new FileStream("output.dat", FileMode.Create, FileAccess.Write, FileShare.None);
GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, true);

// Read from gzip steam
while ((count = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
{
    // Write to output file
    fileOutput.Write(buffer, 0, count);
}

// Close the streams
...

I've checked the downloaded file; it's 13MB when compressed, and contains one XML file. I've manually decompressed the XML file, and the content is all there. But when I do it with this code, it only outputs the very beginning of the XML file.

Anyone have any ideas why this might be happening?

+2  A: 

EDIT

Try not leaving the GZipStream open:

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress,  
                                                                         false);

or

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress);
David Neale
Yes, I've tried CopyTo(). The result is the same. I have no idea why it can't read further than it does.
Ed
Tried with using statements; no change.
Ed
Tried not leaving the GZipStream open; no change.
Ed
A: 

Are you calling Close or Flush on fileOutput? (Or just wrap it in a using, which is recommended practice.) If you don't the file might not be flushed to disk when your program ends.

Ruben
All 3 streams are closed after the reading is done. The problem is not that the data isn't written correctly to the output file, but that the Read() doesn't read the whole input file.Could something be interrupting it? It reads the exact number of bytes every time before it stops, which is curious.
Ed
What is the value of `count` after the first read?
David Neale
After the first read it's 4096, the second read is 532, and then it stops.
Ed
Try not leaving the stream open in the cctor.
David Neale
A: 

I ended up using a gzip executable to do the decompression instead of a GZipStream. It can't handle the file for some reason, but the executable can.

Ed