zoukankan      html  css  js  c++  java
  • GZip解压缩

      1 public class GZipHelper
      2     {
      3         public static void DecompressFile(string sourceFile, string destinationFile)
      4         {
      5             // make sure the source file is there
      6             if (File.Exists(sourceFile) == false)
      7                 throw new FileNotFoundException();
      8 
      9             // Create the streams and byte arrays needed
     10             FileStream sourceStream = null;
     11             FileStream destinationStream = null;
     12             GZipStream decompressedStream = null;
     13             byte[] quartetBuffer = null;
     14 
     15             try
     16             {
     17                 // Read in the compressed source stream
     18                 sourceStream = new FileStream(sourceFile, FileMode.Open);
     19 
     20                 // Create a compression stream pointing to the destiantion stream
     21                 decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);
     22 
     23                 // Read the footer to determine the length of the destiantion file
     24                 quartetBuffer = new byte[4];
     25                 int position = (int)sourceStream.Length - 4;
     26                 sourceStream.Position = position;
     27                 sourceStream.Read(quartetBuffer, 0, 4);
     28                 sourceStream.Position = 0;
     29                 int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
     30 
     31                 byte[] buffer = new byte[checkLength + 100];
     32 
     33                 int offset = 0;
     34                 int total = 0;
     35 
     36                 // Read the compressed data into the buffer
     37                 while (true)
     38                 {
     39                     int bytesRead = decompressedStream.Read(buffer, offset, 100);
     40 
     41                     if (bytesRead == 0)
     42                         break;
     43 
     44                     offset += bytesRead;
     45                     total += bytesRead;
     46                 }
     47 
     48                 // Now write everything to the destination file
     49                 destinationStream = new FileStream(destinationFile, FileMode.Create);
     50                 destinationStream.Write(buffer, 0, total);
     51 
     52                 // and flush everyhting to clean out the buffer
     53                 destinationStream.Flush();
     54             }
     55             catch (ApplicationException ex)
     56             {
     57                 //MessageBox.Show(ex.Message, "解压文件时发生错误:", MessageBoxButtons.OK, MessageBoxIcon.Error);
     58                 throw ex;
     59             }
     60             finally
     61             {
     62                 // Make sure we allways close all streams
     63                 if (sourceStream != null)
     64                     sourceStream.Close();
     65 
     66                 if (decompressedStream != null)
     67                     decompressedStream.Close();
     68 
     69                 if (destinationStream != null)
     70                     destinationStream.Close();
     71             }
     72 
     73         }
     74 
     75         public static void CompressFile(string sourceFile, string destinationFile)
     76         {
     77             // make sure the source file is there
     78             if (File.Exists(sourceFile) == false)
     79                 throw new FileNotFoundException();
     80 
     81             // Create the streams and byte arrays needed
     82             byte[] buffer = null;
     83             FileStream sourceStream = null;
     84             FileStream destinationStream = null;
     85             GZipStream compressedStream = null;
     86 
     87             try
     88             {
     89                 // Read the bytes from the source file into a byte array
     90                 sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);
     91 
     92                 // Read the source stream values into the buffer
     93                 buffer = new byte[sourceStream.Length];
     94                 int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);
     95 
     96                 if (checkCounter != buffer.Length)
     97                 {
     98                     throw new ApplicationException();
     99                 }
    100 
    101                 // Open the FileStream to write to
    102                 destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write);
    103 
    104                 // Create a compression stream pointing to the destiantion stream
    105                 compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true);
    106 
    107                 // Now write the compressed data to the destination file
    108                 compressedStream.Write(buffer, 0, buffer.Length);
    109             }
    110             catch (ApplicationException ex)
    111             {
    112                 //MessageBox.Show(ex.Message, "压缩文件时发生错误:", MessageBoxButtons.OK, MessageBoxIcon.Error);
    113                 throw ex;
    114             }
    115             finally
    116             {
    117                 // Make sure we allways close all streams
    118                 if (sourceStream != null)
    119                     sourceStream.Close();
    120 
    121                 if (compressedStream != null)
    122                     compressedStream.Close();
    123 
    124                 if (destinationStream != null)
    125                     destinationStream.Close();
    126             }
    127         }
    128     }
  • 相关阅读:
    夺命雷公狗---linux NO:8 linux的通配符和ll以及ls的使用方法
    夺命雷公狗---linux NO:7 linux命令基本格式
    夺命雷公狗---linux NO:6 linux远程登录和关机和重启
    夺命雷公狗---解决网络和共享中心打不开的问题
    夺命雷公狗---linux NO:5 linux系统登录和注销
    夺命雷公狗---linux NO:4 linux系统运行级别
    利用win7系统自带服务在内网搭建ftp服务器
    2017-05-31--夺命雷公狗发牢骚
    夺命雷公狗C/C++-----9---自定义一个函数测试简单的运算
    夺命雷公狗C/C++-----8---使用ShellExecute打开一个文件和一个网址和打印文件
  • 原文地址:https://www.cnblogs.com/zhanhengzong/p/2813323.html
Copyright © 2011-2022 走看看