您的位置:首页 > 编程语言 > C#

ICSharpCode.SharpZipLib.dll实现压缩解压一个树形目录

2008-06-23 13:59 716 查看
using System;

using System.IO;

using ICSharpCode.SharpZipLib.Checksums;

using ICSharpCode.SharpZipLib.Zip;

using ICSharpCode.SharpZipLib.GZip;

using System.Collections;

namespace ZipSharpLibray.Common.Control

{

/// <summary>

/// Class1 的摘要说明。

/// </summary>

public class FileZipCreate

{

private static FileZipCreate filezipcreate=null;

private string zipfilecreatename;

private string filesdirectorypath;

private int dirnamelength = 0;

private int ziplevel = 6;

private FileZipCreate()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

/// <summary>

/// 压缩后的文件的全名称

/// </summary>

public string ZipFileCreateName

{

set

{

this.zipfilecreatename=value;

}

get

{

return this.zipfilecreatename;

}

}

/// <summary>

/// 待压缩文件目录

/// </summary>

public string FileDirectoryPath

{

set

{

this.filesdirectorypath=value;

}

get

{

return this.filesdirectorypath;

}

}

public int ZipLevel

{

set

{

this.ziplevel=value;

}

get

{

return this.ziplevel;

}

}

public static FileZipCreate ZipFileInstance()

{

if(filezipcreate==null)

{

filezipcreate=new FileZipCreate();

}

return filezipcreate;

}

/// <summary>

/// 压缩文件的方法

/// </summary>

public void ZipFileCreate()

{

ZipOutputStream zipoutputstream= new ZipOutputStream(File.Create(this.zipfilecreatename));

zipoutputstream.SetLevel(this.ziplevel);

Crc32 crc = new Crc32();

Hashtable fileList=this.getAllFies();

foreach (DictionaryEntry item in fileList)

{

FileStream fs = File.OpenRead(item.Key.ToString());

byte[] buffer = new byte[fs.Length];

fs.Read(buffer, 0, buffer.Length);

ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(this.filesdirectorypath.Length-this.dirnamelength));

entry.DateTime = (DateTime)item.Value;

entry.Size = fs.Length;

fs.Close();

crc.Reset();

crc.Update(buffer);

entry.Crc = crc.Value;

zipoutputstream.PutNextEntry(entry);

zipoutputstream.Write(buffer, 0, buffer.Length);

}

zipoutputstream.Finish();

zipoutputstream.Close();

}

/// <summary>

/// 获取所有文件

/// </summary>

/// <returns></returns>

private Hashtable getAllFies()

{

Hashtable FilesList = new Hashtable();

DirectoryInfo fileDire = new DirectoryInfo(this.filesdirectorypath);

if(!fileDire.Exists)

{

throw new System.IO.FileNotFoundException("目录:"+ fileDire.FullName + "没有找到!");

}

this.dirnamelength=fileDire.Name.Length;

this.getAllDirFiles(fileDire,FilesList);

this.getAllDirsFiles(fileDire.GetDirectories(),FilesList);

return FilesList;

}

/// <summary>

/// 获取一个文件夹下的所有文件夹里的文件

/// </summary>

/// <param name="dirs"></param>

/// <param name="filesList"></param>

private void getAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)

{

foreach (DirectoryInfo dir in dirs)

{

foreach (FileInfo file in dir.GetFiles("*.*"))

{

filesList.Add(file.FullName,file.LastWriteTime);

}

this.getAllDirsFiles(dir.GetDirectories(),filesList);

}

}

/// <summary>

/// 获取一个文件夹下的文件

/// </summary>

/// <param name="strDirName">目录名称</param>

/// <param name="filesList">文件列表HastTable</param>

private void getAllDirFiles(DirectoryInfo dir,Hashtable filesList)

{

foreach (FileInfo file in dir.GetFiles("*.*"))

{

filesList.Add(file.FullName, file.LastWriteTime);

}

}

}

}

//解压

using System;

using System.IO;

using ICSharpCode.SharpZipLib.Checksums;

using ICSharpCode.SharpZipLib.Zip;

using ICSharpCode.SharpZipLib.GZip;

namespace ZipSharpLibray.Common.Control

{

/// <summary>

/// UZipFilesCreate 的摘要说明。

/// </summary>

public class UZipFilesCreate

{

private string zipfilename;

private string filescreatepath;

private static UZipFilesCreate uzipfilescreate=null;

private UZipFilesCreate()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

/// <summary>

/// Zip文件目录

/// </summary>

public string ZipFileName

{

set

{

this.zipfilename=value;

}

get

{

return this.zipfilename;

}

}

/// <summary>

/// 解压文件目录

/// </summary>

public string filesCreatePath

{

set

{

this.filescreatepath=value;

}

get

{

return this.filescreatepath;

}

}

public static UZipFilesCreate UZipFilesInstance()

{

if(uzipfilescreate==null)

{

uzipfilescreate=new UZipFilesCreate();

}

return uzipfilescreate;

}

public void UZipCreateFiles()

{

ZipEntry entry;

ZipInputStream zipinputstream = new ZipInputStream(File.OpenRead(this.zipfilename));

while ((entry = zipinputstream.GetNextEntry()) != null)

{

this.CreateDirList(entry.Name);

string strPath=this.filescreatepath+"//"+entry.Name;

FileStream streamWriter =File.Create(strPath);

byte[] data = new byte[entry.Size];

zipinputstream.Read(data, 0, data.Length);

streamWriter.Write(data, 0, data.Length);

streamWriter.Close();

File.SetLastWriteTime(strPath,entry.DateTime);

}

zipinputstream.Close();

}

private void CreateDirList(string filename)

{

string dirName=this.filescreatepath;

string[] dirlevelname=filename.Split('//');

for(int i=0;i<dirlevelname.Length-1;i++)

{

dirName+="//"+dirlevelname[i];

if(Directory.Exists(dirName))

{

continue;

}

Directory.CreateDirectory(dirName);

}

}

}

}

//调用

using ZipSharpLibray.Common.Control;

......

private void Button1_Click(object sender, System.EventArgs e)

{

//压缩

FileZipCreate filezipcreate=FileZipCreate.ZipFileInstance();

filezipcreate.ZipFileCreateName=Server.MapPath(DateTime.Now.ToString("yyyyMMddmmss")+".zip");

filezipcreate.FileDirectoryPath=Server.MapPath("../Admin/Css");

filezipcreate.ZipFileCreate();

}

private void Button2_Click(object sender, System.EventArgs e)

{

//解压

UZipFilesCreate uzipfilescreate=UZipFilesCreate.UZipFilesInstance();

uzipfilescreate.ZipFileName=this.File1.PostedFile.FileName.Trim();

uzipfilescreate.filesCreatePath=Server.MapPath("");

uzipfilescreate.UZipCreateFiles();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: