C#將多個文件打包成.zip文件

本文主要是介紹了下利用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文件時會報目錄不存在錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章