在C#中用GZipStream压缩与解压数据

需要先using

using System.IO;
using System.IO.Compression;

 

// 压缩
        private void Compress(Stream source, Stream dest) {
            using (GZipStream zipStream = new GZipStream(dest, CompressionMode.Compress, true)) {
                byte[] buf = new byte[1024];
                int len;
                while ((len = source.Read(buf, 0, buf.Length)) > 0) {
                    zipStream.Write(buf, 0, len);
                }
            }
        }

        // 解压
        private void Decompress(Stream source, Stream dest) {
            using (GZipStream zipStream = new GZipStream(source, CompressionMode.Decompress, true)) {
                byte[] buf = new byte[1024];
                int len;
                while ((len = zipStream.Read(buf, 0, buf.Length)) > 0) {
                    dest.Write(buf, 0, len);
                }
            }
        }

示例:

internal void ExportPackage(string filename, string expression, Stream recordStream, string postscript) {
            short version = 1;
            using (MemoryStream stream = new MemoryStream()) {
                // 写入版本号
                StoreBase.WriteValue(stream, version);               
                // 写入数据实体
                byte[] dataBytes = ObjectHelper.Serialize(this.ActiveObject);
                StoreBase.WriteValue(stream, dataBytes);               
                // 写入函数
                StoreBase.WriteValue(stream, _functionDeclares.Count);
                foreach (string typeName in _functionDeclares.Keys) {
                    StoreBase.WriteValue(stream, typeName);
                    StoreBase.WriteValue(stream, _functionDeclares[typeName].Count);

                    foreach (FuncDescrption func in _functionDeclares[typeName]) {
                        StoreBase.WriteValue(stream, func.FuncName);
                        StoreBase.WriteValue(stream, func.NameParams);
                        StoreBase.WriteValue(stream, func.Descrption);
                    }
                }
                // 写入表达式
                StoreBase.WriteValue(stream, expression);
                // 写入执行历史
                byte[] recordBytes = new byte[recordStream.Length];
                recordStream.Read(recordBytes, 0, recordBytes.Length);
                StoreBase.WriteValue(stream, recordBytes);
                // 写入调试附言
                StoreBase.WriteValue(stream, postscript);

                // 压缩
                stream.Position = 0;
                using (FileStream fs = new FileStream(filename, FileMode.Create)) {
                    Compress(stream, fs);
                }
            }
        }

        internal void ImportPackage(string filename, LoadPackageEventHandler handler) {
            short version = 1;
            using (MemoryStream stream = new MemoryStream()) {
                // 解压缩
                using (FileStream fs = new FileStream(filename, FileMode.Open)) {
                    Decompress(fs, stream);
                }
                stream.Position = 0;

                // 读取版本号
                version = StoreBase.ReadValue(stream, version);
                // 读取数据实体
                byte[] dataBytes = StoreBase.ReadValue(stream, new byte[0]);
                this.ActiveObject = ObjectHelper.Deserialize(dataBytes);
                // 读取函数
                _functionDeclares.Clear();
                int typeCount = StoreBase.ReadValue(stream, (int)0);
                for (int i = 0; i < typeCount; i++) {
                    string typeName = StoreBase.ReadValue(stream, string.Empty);
                    int funcCount = StoreBase.ReadValue(stream, (int)0);

                    string funcName = string.Empty;
                    string nameParams = string.Empty;
                    string descrption = string.Empty;
                    for (int j = 0; j < funcCount; j++) {
                        funcName = StoreBase.ReadValue(stream, funcName);
                        nameParams = StoreBase.ReadValue(stream, nameParams);
                        descrption = StoreBase.ReadValue(stream, descrption);

                        this.AddFunctionDeclare(typeName, funcName, nameParams, descrption);
                    }
                }
                // 读取表达式
                string expression = StoreBase.ReadValue(stream, string.Empty);
                // 读取执行历史
                byte[] recordBytes = StoreBase.ReadValue(stream, new byte[0]);
                MemoryStream recordStream = new MemoryStream();
                recordStream.Write(recordBytes, 0, recordBytes.Length);
                recordStream.Position = 0;
                // 读取调试附言
                string postscript = StoreBase.ReadValue(stream, string.Empty);

                handler(expression, recordStream, postscript);
            }
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值