/// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="sourceFile">要操作的文件</param>
        /// <param name="destinationFile">操作后的文件</param>
        public void CompressFile(string sourceFile, string destinationFile)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();
            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                byte[] buffer = new byte[sourceStream.Length];
                int checkCounter = sourceStream.Read(buffer,0,buffer.Length);
                if (checkCounter != buffer.Length) throw new ApplicationException();
                using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))
                    {
                        compressedStream.Write(buffer,0,buffer.Length);
                    }
                }
            }
        }
        /// <summary>
        /// 解压文件
        /// </summary>
        /// <param name="sourceFile">要操作的文件</param>
        /// <param name="destinationFile">操作后的文件</param>
        public void DecompressFile(string sourceFile, string destinationFile)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();
            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
            {
                byte[] quartetBuffer = new byte[4];
                int position = (int)sourceStream.Length - 4;
                sourceStream.Position = position;
                sourceStream.Read(quartetBuffer,0,4);
                sourceStream.Position = 0;
                int checkLength = BitConverter.ToInt32(quartetBuffer,0);
                byte[] buffer = new byte[checkLength + 100];
                using (GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true))
                {
                    int total = 0;
                    for (int offset=0; ;)
                    {
                        int bytesRead = decompressedStream.Read(buffer,offset,100);
                        if (bytesRead == 0) break;
                        offset += bytesRead;
                        total += bytesRead;
                    }
                    using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))
                    {
                        destinationStream.Write(buffer,0,total);
                        destinationStream.Flush();
                    }
                }
            }
        }
两个文件都需要同时存在
原文:http://www.cnblogs.com/jianghaidong/p/5248054.html