日期:2014-05-17 浏览次数:20926 次
本文主要是介绍了下利用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(); } } } }
注意: zipedfilepath的父级目录必须存在,否则在创建.zip文件时会报目录不存在错误。