using ICSharpCode.SharpZipLib.Zip;
using System.Collections;
using System.IO;
namespace ProjectBase.Data.Zip
{
public static class ZipUtility
{
///
/// 压缩文件中的文件,可设置密码
///
/// 输入的文件夹
/// 输出的压缩文件全名
/// 压缩密码
public static void ZipFiles(string inputFolderPath, string outputPathAndFile, string password)
{
ArrayList ar = GenerateFileList(inputFolderPath);
int TrimLength = (Directory.GetParent(inputFolderPath)).ToString().Length;
// find number of chars to remove // from orginal file path
TrimLength += 1; //remove '\'
FileStream ostream;
byte[] obuffer;
string outPath =/* inputFolderPath + @"\" + */outputPathAndFile;
if (!Directory.Exists(Path.GetDirectoryName(outPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(outPath));
}
if (File.Exists(outPath))
{
return;
}
ZipOutputStream oZipStream = new ZipOutputStream(File.Create(outPath));
if (!string.IsNullOrEmpty(password))
{
oZipStream.Password = password;
}
oZipStream.SetLevel(9); // 设置最大压缩率
ZipEntry oZipEntry;
foreach (string Fil in ar)
{
oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength));
oZipStream.PutNextEntry(oZipEntry);
if (!Fil.EndsWith(@"/")) // 如果文件以 '/' 结束,则是目录
{
ostream = File.OpenRead(Fil);
obuffer = new byte[ostream.Length];
ostream.Read(obuffer, 0, obuffer.Length);
oZipStream.Write(obuffer, 0, obuffer.Length);
}
}
oZipStream.Finish();
oZipStream.Close();
}
///
/// 根据文件夹生成文件列表
///
///
///
private static ArrayList GenerateFileList(string Dir)
{
ArrayList fils = new ArrayList();
bool Empty = true;
foreach (string file in Directory.GetFiles(Dir))
{
fils.Add(file);
Empty = false;
}
if (Empty)
{
//加入完全为空的目录
if (Directory.GetDirectories(Dir).Length == 0)
{
fils.Add(Dir + @"/");
}
}
foreach (string dirs in Directory.GetDirectories(Dir)) // 递归目录
{
foreach (object obj in GenerateFileList(dirs))
{
fils.Add(obj);
}
}
return fils;
}
///
/// 解压文件到指定的目录,可设置密码、删除原文件等
///
/// 压缩文件全名
/// 解压输出文件目录
/// 解压密码
/// 是否删除原文件(压缩文件)
public static void UnZipFiles(string zipPathAndFile, string outputFolder, string password, bool deleteZipFile)
{
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipPathAndFile)))
{
if (password != null && password != string.Empty)
{
s.Password = password;
}
ZipEntry theEntry;
string tmpEntry = string.Empty;
while ((theEntry = s.GetNextEntry()) != null)
{
#region 遍历每个Entry对象进行解压处理
string directoryName = outputFolder;
string fileName = Path.GetFileName(theEntry.Name);
if (directoryName != "")
{
Directory.CreateDirectory(directoryName);
}
if (fileName != string.Empty)
{
if (theEntry.Name.IndexOf(".ini") < 0)
{
string fullPath = directoryName + "\\" + theEntry.Name;
fullPath = fullPath.Replace("\\ ", "\\");
string fullDirPath = Path.GetDirectoryName(fullPath);
if (!Directory.Exists(fullDirPath)) Directory.CreateDirectory(fullDirPath);
using (FileStream streamWriter = File.Create(fullPath))
{
#region 写入文件流
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
#endregion
}
}
}
#endregion
}
}
if (deleteZipFile)
{
File.Delete(zipPathAndFile);
}
}
}
}