C#针对多个指定文件进行Zip压缩方法

这段代码展示了如何使用ICSharpCode.SharpZipLib库来压缩文件并提供下载。首先,创建ZipOutputStream以设定压缩级别,然后通过递归压缩文件到指定的zip文件。接着,使用SaveFileDialog让用户选择保存位置,最后通过WebClient下载压缩文件到选定的位置。

ICSharpCode.SharpZipLib.dll类库资源下载地址
需要下载ICSharpCode.SharpZipLib.dll,并添加到项目引用。

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="sourceFilePath">文件路径</param>
        /// <param name="destinationZipFilePath">压缩后的地址</param>
        public void DownLoad(string fileName)
        {
            if (fileName.Length > 0)
            {
                string sourceFilePath = System.AppDomain.CurrentDomain.BaseDirectory + @"File\";
                string destinationZipFilePath = sourceFilePath + DateTime.Now.ToString("yyyyMMddHHmmss") + "附件.zip";
                //生成压缩文件夹
                ZipOutputStream zipStream = new ZipOutputStream(System.IO.File.Create(destinationZipFilePath));
                zipStream.SetLevel(6);  // 压缩级别 0-9
                //创建压缩文件
                CreateZipFiles(fileName, sourceFilePath, zipStream);
                zipStream.Finish();
                zipStream.Close();
                //文件路径截取压缩文件名
                string FileName = Path.GetFileName(destinationZipFilePath);
                Console.WriteLine(FileName);
                //实例化保存控件
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                //下载窗体标题
                saveFileDialog.Title = "下载文件";
                //设置文件类型
                saveFileDialog.Filter = "所有文件(*.*)|*.*";
                //设置默认文件名
                saveFileDialog.FileName = FileName;
                //调用窗口返回值
                DialogResult dialogResult = saveFileDialog.ShowDialog();
                if (dialogResult == DialogResult.OK)
                {
                    System.Net.WebClient client = new System.Net.WebClient();
                    //一个真正存放数据的地址,一般我们将连接存在数据库中,数据存放在数据服务器上
                    byte[] data = client.DownloadData(destinationZipFilePath);
                    FileStream fs = new FileStream(saveFileDialog.FileName, FileMode.Create);
                    fs.Write(data, 0, data.Length);
                    fs.Close();
                }
            }
            else
            {
            }
        }

        /// <summary>
        /// 递归压缩文件
        /// </summary>
        /// <param name="fileName">待压缩的文件名</param>
        /// <param name="sourceFilePath">待压缩的文件或文件夹路径</param>
        /// <param name="zipStream">打包结果的zip文件路径(类似 D:\WorkSpace\a.zip),全路径包括文件名和.zip扩展名</param>
        private static void CreateZipFiles(string fileName, string sourceFilePath, ZipOutputStream zipStream)
        {
            //声明一个 Crs32 类型的对象 crc ,并将之实例化。
            Crc32 crc = new Crc32();
            //按;切割文件名存储到数组
            string[] _fileName = fileName.Split(new char[] { ';' });
            foreach (string file in _fileName)
            {
                //创建文件路径的对象
                string filePath = sourceFilePath + file;
                FileStream fileStream = System.IO.File.OpenRead(filePath);
                //定义一个字节数组,相当于缓存
                byte[] buffer = new byte[fileStream.Length];
                fileStream.Read(buffer, 0, buffer.Length);
                //string tempFile = file.Substring((a.LastIndexOf("\\"))+1);
                //实例化文件名比如“1.txt”
                ZipEntry entry = new ZipEntry(file);
                entry.DateTime = DateTime.Now;
                entry.Size = fileStream.Length;
                fileStream.Close();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc = crc.Value;
                zipStream.PutNextEntry(entry);
                zipStream.Write(buffer, 0, buffer.Length);
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值