C#将多个文件打包成.zip文件

来源:互联网 发布:优化的同义词 编辑:程序博客网 时间:2024/06/05 08:18

本文主要是介绍了下利用ICSharpCode.SharpZipLib.dll(官方下载地址:http://www.icsharpcode.net/opensource/sharpziplib/)这个程序集将windows文件进行打包。

下面给出ZipHelper.cs这个类全部代码,代码中只包含了对多个文件的打包(暂时不包括文件夹和解压功能)

using System;using System.Linq;using System.IO;using ICSharpCode.SharpZipLib.Zip;using ICSharpCode.SharpZipLib.Checksums;namespace WindowsFormsApplication1{    public class ZipHelper    {        /// <summary>        ///  压缩多个文件        /// </summary>        /// <param name="files">文件名</param>        /// <param name="ZipedFileName">压缩包文件名</param>        /// <param name="Password">解压码</param>        /// <returns></returns>        public static void Zip(string[] files, string ZipedFileName, string Password)        {            files = files.Where(f => File.Exists(f)).ToArray();             if (files.Length == 0) throw new FileNotFoundException("未找到指定打包的文件");            ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFileName));            s.SetLevel(6);            if (!string.IsNullOrEmpty(Password.Trim())) s.Password = Password.Trim();            ZipFileDictory(files, s);            s.Finish();            s.Close();        }        /// <summary>        ///  压缩多个文件        /// </summary>        /// <param name="files">文件名</param>        /// <param name="ZipedFileName">压缩包文件名</param>        /// <returns></returns>        public static void Zip(string[] files, string ZipedFileName)        {            Zip(files, ZipedFileName, string.Empty);        }        private static void ZipFileDictory(string[] files, ZipOutputStream s)        {            ZipEntry entry = null;            FileStream fs = null;            Crc32 crc = new Crc32();            try            {                //创建当前文件夹                entry = new ZipEntry("/");  //加上 “/” 才会当成是文件夹创建                s.PutNextEntry(entry);                s.Flush();                foreach (string file in files)                {                    //打开压缩文件                    fs = File.OpenRead(file);                    byte[] buffer = new byte[fs.Length];                    fs.Read(buffer, 0, buffer.Length);                    entry = new ZipEntry("/" + Path.GetFileName(file));                    entry.DateTime = DateTime.Now;                    entry.Size = fs.Length;                    fs.Close();                    crc.Reset();                    crc.Update(buffer);                    entry.Crc = crc.Value;                    s.PutNextEntry(entry);                    s.Write(buffer, 0, buffer.Length);                }            }            finally            {                if (fs != null)                {                    fs.Close();                    fs = null;                }                if (entry != null)                    entry = null;                GC.Collect();            }        }    }}

直接调用 ZipHelper.Zip(filepaths,zipedfilepath)即可。

注意: zipedfilepath的父级目录必须存在,否则在创建.zip文件时会报目录不存在错误。

原创粉丝点击