GZipStream和解压缩

我有应该进行压缩的代码:

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(); 

我认为确实如此,但我想解压缩上面压缩的内容。 我这样想:

 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(); 

在这里它没有…我有nRead = 0 befeore进入循环…我做错了什么? 我使用的测试文件是最简单的TEXT文件(大小:104字节)……

我的第一个想法是你还没有关闭csStream 。 如果你使用这种情况会自动发生。 由于gzip缓冲数据,你可能会遗漏一些。

其次; 不增加offset ; 这是缓冲区 (不是流)的偏移量。 离开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); } } 

我有两种方法就像詹姆斯罗兰提到的那样。

 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(); } 

但是,我正在使用上传

 Request.Files[0] 

然后压缩并保存在db中。 然后我拉出img,解压缩并设置一个src

 $"data:image/gif;base64,{ToBase64String(Decompress(img))}"; 

下面的代码演示了使用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); }