需引用:ICSharpCode.SharpZipLib.dll
下载地址:http://download.csdn.net/download/u014117094/10017257
/**
* 名称: 文件文件夹压缩解压工具类* 作者:
* 时间: 2017.08.15
* 版本: 1
* 说明: 文件文件夹压缩解压工具类
*
* 历史:
* 版本 时间 修改人 说明
* 1 2017.08.15 lizhongxiang 文件文件夹压缩解压工具类
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
namespace tysoft
{
public class ZipHelper
{
/// <summary>
/// 压缩单个文件
/// </summary>
/// <param name="fileToZip">被压缩的文件名称(包含文件路径)</param>
/// <param name="zipedFile">压缩后的文件名称(包含文件路径)</param>
/// <param name="compressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel)
{
//如果文件没有找到,则报错
if (!File.Exists(fileToZip))
{
throw new FileNotFoundException("文件:" + fileToZip + "没有找到!");
}
if (zipedFile == string.Empty)
{
zipedFile = Path.GetFileNameWithoutExtension(fileToZip) + ".zip";
}
if (Path.GetExtension(zipedFile) != ".zip")
{
zipedFile = zipedFile + ".zip";
}
如果指定位置目录不存在,创建该目录
//string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\"));
//if (!Directory.Exists(zipedDir))
// Directory.CreateDirectory(zipedDir);
//被压缩文件名称
string filename = fileToZip.Substring(fileToZip.LastIndexOf('\\') + 1);
FileStream streamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read);
FileStream zipFile = File.Create(zipedFile);
ZipOutputStream zipStream = new ZipOutputStream(zipFile);
ZipEntry zipEntry = new ZipEntry(filename);
zipStream.PutNextEntry(zipEntry);
zipStream.SetLevel(compressionLevel);
byte[] buffer = new byte[2048];
Int32 size = streamToZip.Read(buffer, 0, buffer.Length);
zipStream.Write(buffer, 0, size);
try
{
while (size < streamToZip.Length)
{
int sizeRead = streamToZip.Read(buffer, 0, buffer.Length);
zipStream.Write(buffer, 0, sizeRead);
size += sizeRead;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
zipStream.Finish();
zipStream.Close();
streamToZip.Close();
}
}
/// <summary>
/// 压缩文件夹的方法
/// </summary>
/// <param name="dirToZip">被压缩的文件路径</param>
/// <param name="zipedFile">压缩后的文件名称(包含文件路径)</param>
/// <param name="compressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
public static void ZipDir(string dirToZip, string zipedFile, int compressionLevel)
{
//压缩文件为空时默认与压缩文件夹同一级目录
if (zipedFile == string.Empty)
{
zipedFile = dirToZip.Substring(dirToZip.LastIndexOf("\\") + 1);
zipedFile = dirToZip.Substring(0, dirToZip.LastIndexOf("\\")) + "\\" + zipedFile + ".zip";
}
if (Path.GetExtension(zipedFile) != ".zip")
{
zipedFile = zipedFile + ".zip";
}
using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(zipedFile)))
{
zipoutputstream.SetLevel(compressionLevel);
Crc32 crc = new Crc32();
Hashtable fileList = GetAllFies(dirToZip);
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(dirToZip.Length + 1));
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);
}
}
}
/// <summary>
/// 获取所有文件
/// </summary>
/// <returns></returns>
private static Hashtable GetAllFies(string dir)
{
Hashtable filesList = new Hashtable();
DirectoryInfo fileDire = new DirectoryInfo(dir);
if (!fileDire.Exists)
{
throw new FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
}
GetAllDirFiles(fileDire, filesList);
GetAllDirsFiles(fileDire.GetDirectories(), filesList);
return filesList;
}
/// <summary>
/// 获取一个文件夹下的所有文件夹里的文件
/// </summary>
/// <param name="dirs"></param>
/// <param name="filesList"></param>
private static void GetAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)
{
foreach (DirectoryInfo dir in dirs)
{
foreach (FileInfo file in dir.GetFiles("*.*"))
{
filesList.Add(file.FullName, file.LastWriteTime);
}
GetAllDirsFiles(dir.GetDirectories(), filesList);
}
}
/// <summary>
/// 获取一个文件夹下的文件
/// </summary>
/// <param name="dir">目录名称</param>
/// <param name="filesList">文件列表HastTable</param>
private static void GetAllDirFiles(DirectoryInfo dir, Hashtable filesList)
{
foreach (FileInfo file in dir.GetFiles("*.*"))
{
filesList.Add(file.FullName, file.LastWriteTime);
}
}
/// <summary>
/// 功能:解压zip格式的文件。
/// </summary>
/// <param name="zipFilePath">压缩文件路径</param>
/// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
/// <returns>解压是否成功</returns>
public static void UnZip(string zipFilePath, string unZipDir)
{
if (zipFilePath == string.Empty)
{
throw new Exception("压缩文件不能为空!");
}
if (!File.Exists(zipFilePath))
{
throw new FileNotFoundException("压缩文件不存在!");
}
//解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
if (unZipDir == string.Empty)
unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
if (!unZipDir.EndsWith("\\"))
unZipDir += "\\";
if (!Directory.Exists(unZipDir))
Directory.CreateDirectory(unZipDir);
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if (!string.IsNullOrEmpty(directoryName))
{
Directory.CreateDirectory(unZipDir + directoryName);
}
if (directoryName != null && !directoryName.EndsWith("\\"))
{
directoryName += "\\";
}
if (fileName != String.Empty)
{
using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
{
byte[] data = new byte[2048];
while (true)
{
int size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
}
}
}
}
public static List<string> GetDirNames(string fileName)
{
List<string> doucumentList = new List<string>();
if (fileName == string.Empty)
{
throw new Exception("压缩文件不能为空!");
}
if (!File.Exists(fileName))
{
throw new FileNotFoundException("压缩文件不存在!");
}
using (ZipInputStream s = new ZipInputStream(File.OpenRead(fileName)))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
if (!string.IsNullOrEmpty(directoryName)&&!doucumentList.Contains(directoryName))
{
doucumentList.Add(directoryName);
}
}
}
return doucumentList;
}
}
}