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