C#压缩文件代码

 #region 压缩文件
        /// <summary>
        /// 压缩文件
        /// </summary>
        public void Zip()
        {
            this.Zip(string.Empty);
        }


        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="vPwd">压缩文件的密码</param>
        public void Zip(string vPwd)
        {
            int vLevel = 3; // 压缩级别 0-9
            if (string.IsNullOrEmpty(this.ZipFile))
            {
                return;
            }


            string vZipDic = Path.GetDirectoryName(this.ZipFile);


            if (!Directory.Exists(vZipDic))
            {
                Directory.CreateDirectory(vZipDic);
            }


            Queue<ZipPath> vZips = this.GetZipPaths();
            int vTotal = vZips.Count;


            ZipInfo vZipInfo = null;
            using (ZipOutputStream s = new ZipOutputStream(File.Create(this.ZipFile)))
            {
                s.SetLevel(vLevel); // 压缩级别 0-9


                if (!string.IsNullOrEmpty(vPwd))
                {
                    s.Password = vPwd;
                }


                ByteHelper vByteUtil = new ByteHelper();


                while (vZips.Count > 0)
                {
                    ZipPath vItem = vZips.Dequeue();


                    int vPos = vTotal - vZips.Count;
                    ZipEntry entry = new ZipEntry(vItem.ZipFile);
                    entry.DateTime = DateTime.Now;
                    s.PutNextEntry(entry);


                    FileInfo vFileInfo = new FileInfo(vItem.File);
                    vZipInfo = new ZipInfo(vFileInfo.DirectoryName, vFileInfo.FullName, vFileInfo.Length, vPos, vTotal);


                    this.Trigger(this.ItemZiping, vZipInfo, true);
                    try
                    {
                        using (FileStream fs = File.OpenRead(vItem.File))
                        {
                            vByteUtil.CopyStream(fs, s);
                        }
                    }
                    catch (Exception ex)
                    {
                        LogHelper.WriteLog(ex);
                        this.Trigger(this.Error, vZipInfo, false);
                    }


                    this.Trigger(this.ItemZiped, vZipInfo, true);
                }


                s.Finish();
                s.Close();
            }


            this.Trigger(this.Ziped, vZipInfo, true);
        }


        /// <summary>
        /// 获取需要压缩的文件的目录信息
        /// </summary>
        /// <returns></returns>
        private Queue<ZipPath> GetZipPaths()
        {
            Queue<ZipPath> vZipFiles = new Queue<ZipPath>();


            //添加需要处理的文件夹队列
            Queue<ZipDirectory> vQueue = new Queue<ZipDirectory>();


            //初始化需要压缩的队列
            foreach (string vItem in this.Directors)
            {
                //当文件夹不存在时
                if (!Directory.Exists(vItem))
                {
                    continue;
                }


                DirectoryInfo di = new DirectoryInfo(vItem);
                vQueue.Enqueue(new ZipDirectory(di, di));
            }


            //处理文件夹中的子文件夹,并且添加到需要压缩的文件
            while (vQueue.Count > 0)
            {
                ZipDirectory vItem = vQueue.Dequeue();
                foreach (FileInfo vInfo in vItem.Now.GetFiles())
                {
                    string vZipDirectory = string.Empty;
                    string vNowName = vItem.Now.FullName;
                    string vBaseName = vItem.Base.FullName;
                    if (vNowName != vBaseName)
                    {
                        vZipDirectory = vNowName.Substring(vBaseName.Length + 1);
                    }
                    vZipFiles.Enqueue(GetZipPath(vZipDirectory, vInfo));
                }


                //添加需要压缩的子文件夹
                foreach (DirectoryInfo subDi in vItem.Now.GetDirectories())
                {
                    vQueue.Enqueue(new ZipDirectory(vItem.Base, subDi));
                }
            }


            //添加需要压缩的文件
            foreach (string vFile in this.Files)
            {
                if (!File.Exists(vFile))
                {
                    continue;
                }
                FileInfo vInfo = new FileInfo(vFile);
                vZipFiles.Enqueue(GetZipPath(string.Empty, vInfo));
            }


            return vZipFiles;
        }


        /// <summary>
        /// 获取需要文件以及需要压缩的文件的相对目录
        /// </summary>
        /// <param name="vZipDirectory">相对目录信息</param>
        /// <param name="vInfo">需要压缩的文件</param>
        /// <returns></returns>
        private ZipPath GetZipPath(string vZipDirectory, FileInfo vInfo)
        {
            ZipPath vItem = new ZipPath();


            vItem.ZipDirectory = vZipDirectory;
            vItem.ZipFile = Path.Combine(vZipDirectory, vInfo.Name);
            vItem.File = vInfo.FullName;
            vItem.Directory = vInfo.DirectoryName;


            return vItem;
        }
        #endregion
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个月太忙没时间看C++

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值