I have code that should do the compression:
FileStream fs = new FileStream("g:\\gj.txt", FileMode.Open);
FileStream fd = new FileStream("g:\\gj.zip", FileMode.Create);
GZipStream csStream = new GZipStream(fd, CompressionMode.Compress);
byte[] compressedBuffer = new byte[500];
int offset = 0;
int nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
while (nRead > 0)
{
csStream.Write(compressedBuffer, offset, nRead);
offset = offset + nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
}
fd.Close();
fs.Close();
and I think it does, but I want to decompress what was compressed the way above. I do somethink like that:
FileStream fd = new FileStream("g:\\gj.new", FileMode.Create);
FileStream fs = new FileStream("g:\\gj.zip", FileMode.Open);
GZipStream csStream = new GZipStream(fs, CompressionMode.Decompress);
byte[] decompressedBuffer = new byte[500];
int offset = 0;
int nRead;
nRead=csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length);
while (nRead > 0)
{
fd.Write(decompressedBuffer, offset, nRead);
offset = offset + nRead;
nRead = csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length);
}
fd.Close();
fs.Close();
and here it doesn't... I've got nRead = 0 befeore entering the loop... What I do wrong??
The test file I use is the simpliest TEXT file (size: 104 bytes)...
My first thought is that you haven't closed csStream
. If you use using
this happens automatically. Since gzip buffers data, you could be missing some.
Secondly; don't increment offset
; that is the offset in the buffer (not the stream). Leave at 0:
using (Stream fs = File.OpenRead("gj.txt"))
using (Stream fd = File.Create("gj.zip"))
using (Stream csStream = new GZipStream(fd, CompressionMode.Compress))
{
byte[] buffer = new byte[1024];
int nRead;
while ((nRead = fs.Read(buffer, 0, buffer.Length))> 0)
{
csStream.Write(buffer, 0, nRead);
}
}
using (Stream fd = File.Create("gj.new.txt"))
using (Stream fs = File.OpenRead("gj.zip"))
using (Stream csStream = new GZipStream(fs, CompressionMode.Decompress))
{
byte[] buffer = new byte[1024];
int nRead;
while ((nRead = csStream.Read(buffer, 0, buffer.Length)) > 0)
{
fd.Write(buffer, 0, nRead);
}
}
The two methods I have are like James Roland mentioned.
private static byte[] Compress(HttpPostedFileBase file)
{
var to = new MemoryStream();
var from = new GZipStream(to, CompressionMode.Compress);
file.InputStream.CopyTo(from);
from.Close();
return to.ToArray();
}
private byte[] Decompress(byte [] img)
{
var to = new MemoryStream();
var from = new MemoryStream(img);
var compress = new GZipStream(from, CompressionMode.Decompress);
compress.CopyTo(to);
from.Close();
return to.ToArray();
}
However, I'm using an upload with
Request.Files[0]
then compress and save in the db. Then I pull the img out, decompress and set a src with
$"data:image/gif;base64,{ToBase64String(Decompress(img))}";
Code below demonstrates compression and decompression using GZipStream:
using System;
using System.IO;
using System.IO.Compression;
// ...
static void Main(string[] args)
{
string folder = @"c:\temp";
string dataPath = Path.Combine(folder, "data.dat");
string compressedPath = Path.Combine(folder, "compressed.gz");
string decompressedPath = Path.Combine(folder, "decompressed.dat");
using (FileStream fileReader = File.OpenRead(dataPath))
using (FileStream fileWriter = File.Create(compressedPath))
using (GZipStream compressionStream = new GZipStream(fileWriter, CompressionMode.Compress))
{
// Compresses and writes byte array contents to file
int readlength = 0;
byte[] buffer = new byte[1024];
do
{
readlength = fileReader.Read(buffer, 0, buffer.Length);
compressionStream.Write(buffer, 0, readlength);
} while (readlength > 0);
}
using (FileStream fileReader = File.OpenRead(compressedPath))
using (FileStream fileWriter = File.OpenWrite(decompressedPath))
using (GZipStream compressionStream = new GZipStream(fileReader, CompressionMode.Decompress))
{
// Decompresses and reads data from stream to file
int readlength = 0;
byte[] buffer = new byte[1024];
do
{
readlength = compressionStream.Read(buffer, 0, buffer.Length);
fileWriter.Write(buffer, 0, readlength);
} while (readlength > 0);
}
FileInfo dataFile = new FileInfo(dataPath);
FileInfo compressedFile = new FileInfo(compressedPath);
FileInfo decompressedFile = new FileInfo(decompressedPath);
Console.WriteLine($"Uncompressed file size: {dataFile.Length} bytes");
Console.WriteLine($"Compressed file size: {compressedFile.Length} bytes");
Console.WriteLine($"Decompressed file size: {decompressedFile.Length} bytes");
Console.Write("Press any key to quit . . . ");
Console.ReadKey(true);
}