using System;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
namespace Zip
{
/// <summary>
/// 压缩
/// </summary>
public class MyCompress
{
private static readonly object compressLock = new object();
private static readonly object uncompressLock = new object();
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="FileToZip">要压缩的文件</param>
/// <param name="ZipedPath">压缩后文件路径</param>
/// <param name="CompressionLevel">压缩级别</param>
/// <param name="BlockSize">文件块大小</param>
public static void ZipFile(string FileToZip, string ZipedPath, int CompressionLevel, int BlockSize)
{
lock (compressLock)
{
//如果文件没有找到,则报错
if (!System.IO.File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
}
#region 压缩后文件存放路径
string fileName;
string ZipedFile;
fileName = FileToZip.Substring(FileToZip.LastIndexOf("\") + 1);
ZipedFile = ZipedPath + "\" + fileName + ".zip";
if (!Directory.Exists(ZipedPath))
Directory.CreateDirectory(ZipedPath);
#endregion
using (System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile))
{
using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
{
ZipEntry ZipEntry = new ZipEntry(fileName);
ZipEntry.DateTime = (new System.IO.FileInfo(FileToZip)).LastWriteTime;
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[] buffer = new byte[BlockSize];
System.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 (System.Exception ex)
{
throw ex;
}
ZipStream.Close();
ZipStream.Dispose();
}
ZipFile.Close();
ZipFile.Dispose();
}
StreamToZip.Close();
StreamToZip.Dispose();
}
}
}
/// <summary>
/// 压缩某个目录下的所有文件(如果文件夹不存在将会抛出异常)
/// </summary>
/// <param name="dir"></param>
public static void ZipFile(string dir,string ZipedPath)
{
if (Directory.Exists(dir))
{
string[] Files = Directory.GetFiles(dir);
foreach (string file in Files)
{
try
{
ZipFile(file, ZipedPath, 7, 16384);
}
catch
{
GlobalRuntime.AddRunLog(file+"在压缩的过程中出错!");
continue;
}
}
}
else
throw new Exception("需要进行压缩的文件夹不存在!");
}
/// <summary>
/// 解压指定路径下的所有压缩文件到(\temp)下
/// </summary>
/// <param name="dir"></param>
public static void UnZip(string dir)
{
lock (uncompressLock)
{
if (Directory.Exists(dir))
{
string[] Files = Directory.GetFiles(dir);
foreach (string file in Files)
{
try
{
UnZip(file, (new FileInfo(file)).Directory + "\temp");
}
catch
{
GlobalRuntime.AddRunLog(file + "在解压过程中出错!");
continue;
}
}
}
else
throw new Exception("需要进行解压的文件夹不存在!");
}
}
/// <summary>
/// 解压文件
/// </summary>
/// <param name="ZipFile">要解压的文件</param>
/// <param name="unZipFilePath">解压后存放的路径</param>
public static void UnZip(string zipFile, string unZipFilePath)
{
lock (uncompressLock)
{
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFile)))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(unZipFilePath);
string fileName = Path.GetFileName(theEntry.Name);
//生成解压目录
Directory.CreateDirectory(directoryName);
if (fileName != String.Empty)
{
//解压文件到指定的目录
using (FileStream streamWriter = File.Create(unZipFilePath + theEntry.Name))
{
int size = 16384;
byte[] data = new byte[16384];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
streamWriter.Dispose();
}
}
}
s.Close();
s.Dispose();
}
}
}
}
}