日期:2014-05-17  浏览次数:20716 次

C# 压缩、解压缩类

?

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Checksums;

/*
* 解压缩
* 该程序压缩和解压配合才能使用
* 普通用 Winrar 压缩的文件该解压不能通过
*/
namespace ProductManagerPlugin.Util
{
?? ?/// <summary>
?? ?/// 压缩类
?? ?/// </summary>
?? ?public class ZipClass
?? ?{
?? ? ? ?/// <summary>
?? ? ? ?/// 递归压缩文件夹方法
?? ? ? ?/// </summary>
?? ? ? ?/// <param name="FolderToZip"></param>
?? ? ? ?/// <param name="s"></param>
?? ? ? ?/// <param name="ParentFolderName"></param>
?? ? ? ?private static bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName)
?? ? ? ?{
?? ? ? ? ? ?bool res = true;
?? ? ? ? ? ?string[] folders, filenames;
?? ? ? ? ? ?ZipEntry entry = null;
?? ? ? ? ? ?FileStream fs = null;
?? ? ? ? ? ?Crc32 crc = new Crc32();

?? ? ? ? ? ?try
?? ? ? ? ? ?{

?? ? ? ? ? ? ? ?//创建当前文件夹
?? ? ? ? ? ? ? ?entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/")); ?//加上 “/” 才会当成是文件夹创建
?? ? ? ? ? ? ? ?s.PutNextEntry(entry);
?? ? ? ? ? ? ? ?s.Flush();


?? ? ? ? ? ? ? ?//先压缩文件,再递归压缩文件夹?
?? ? ? ? ? ? ? ?filenames = Directory.GetFiles(FolderToZip);
?? ? ? ? ? ? ? ?foreach (string file in filenames)
?? ? ? ? ? ? ? ?{
?? ? ? ? ? ? ? ? ? ?//打开压缩文件
?? ? ? ? ? ? ? ? ? ?fs = File.OpenRead(file);

?? ? ? ? ? ? ? ? ? ?byte[] buffer = new byte[fs.Length];
?? ? ? ? ? ? ? ? ? ?fs.Read(buffer, 0, buffer.Length);
?? ? ? ? ? ? ? ? ? ?entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + 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);
?? ? ? ? ? ? ? ?}
?? ? ? ? ? ?}
?? ? ? ? ? ?catch
?? ? ? ? ? ?{
?? ? ? ? ? ? ? ?res = false;
?? ? ? ? ? ?}
?? ? ? ? ? ?finally
?? ? ? ? ? ?{
?? ? ? ? ? ? ? ?if (fs != null)
?? ? ? ? ? ? ? ?{
?? ? ? ? ? ? ? ? ? ?fs.Close();
?? ? ? ? ? ? ? ? ? ?fs = null;
?? ? ? ? ? ? ? ?}
?? ? ? ? ? ? ? ?if (entry != null)
?? ? ? ? ? ? ? ?{
?? ? ? ? ? ? ? ? ? ?entry = null;
?? ? ? ? ? ? ? ?}
?? ? ? ? ? ? ? ?GC.Collect();
?? ? ? ? ? ? ? ?GC.Collect(1);
?? ? ? ? ? ?}


?? ? ? ? ? ?folders = Directory.GetDirectories(FolderToZip);
?? ? ? ? ? ?foreach (string folder in folders)
?? ? ? ? ? ?{
?? ? ? ? ? ? ? ?if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))
?? ? ? ? ? ? ? ?{
?? ? ? ? ? ? ? ? ? ?return false;
?? ? ? ? ? ? ? ?}
?? ? ? ? ? ?}

?? ? ? ? ? ?return res;
?? ? ? ?}

<