#region 压缩文件
/// <summary>
/// 压缩文件
/// </summary>
public void Zip()
{
this.Zip(string.Empty);
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="vPwd">压缩文件的密码</param>
public void Zip(string vPwd)
{
int vLevel = 3; // 压缩级别 0-9
if (string.IsNullOrEmpty(this.ZipFile))
{
return;
}
string vZipDic = Path.GetDirectoryName(this.ZipFile);
if (!Directory.Exists(vZipDic))
{
Directory.CreateDirectory(vZipDic);
}
Queue<ZipPath> vZips = this.GetZipPaths();
int vTotal = vZips.Count;
ZipInfo vZipInfo = null;
using (ZipOutputStream s = new ZipOutputStream(File.Create(this.ZipFile)))
{
s.SetLevel(vLevel); // 压缩级别 0-9
if (!string.IsNullOrEmpty(vPwd))
{
s.Password = vPwd;
}
ByteHelper vByteUtil = new ByteHelper();
while (vZips.Count > 0)
{
ZipPath vItem = vZips.Dequeue();
int vPos = vTotal - vZips.Count;
ZipEntry entry = new ZipEntry(vItem.ZipFile);
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
FileInfo vFileInfo = new FileInfo(vItem.File);
vZipInfo = new ZipInfo(vFileInfo.DirectoryName, vFileInfo.FullName, vFileInfo.Length, vPos, vTotal);
this.Trigger(this.ItemZiping, vZipInfo, true);
try
{
using (FileStream fs = File.OpenRead(vItem.File))
{
vByteUtil.CopyStream(fs, s);
}
}
catch (Exception ex)
{
LogHelper.WriteLog(ex);
this.Trigger(this.Error, vZipInfo, false);
}
this.Trigger(this.ItemZiped, vZipInfo, true);
}
s.Finish();
s.Close();
}
this.Trigger(this.Ziped, vZipInfo, true);
}
/// <summary>
/// 获取需要压缩的文件的目录信息
/// </summary>
/// <returns></returns>
private Queue<ZipPath> GetZipPaths()
{
Queue<ZipPath> vZipFiles = new Queue<ZipPath>();
//添加需要处理的文件夹队列
Queue<ZipDirectory> vQueue = new Queue<ZipDirectory>();
//初始化需要压缩的队列
foreach (string vItem in this.Directors)
{
//当文件夹不存在时
if (!Directory.Exists(vItem))
{
continue;
}
DirectoryInfo di = new DirectoryInfo(vItem);
vQueue.Enqueue(new ZipDirectory(di, di));
}
//处理文件夹中的子文件夹,并且添加到需要压缩的文件
while (vQueue.Count > 0)
{
ZipDirectory vItem = vQueue.Dequeue();
foreach (FileInfo vInfo in vItem.Now.GetFiles())
{
string vZipDirectory = string.Empty;
string vNowName = vItem.Now.FullName;
string vBaseName = vItem.Base.FullName;
if (vNowName != vBaseName)
{
vZipDirectory = vNowName.Substring(vBaseName.Length + 1);
}
vZipFiles.Enqueue(GetZipPath(vZipDirectory, vInfo));
}
//添加需要压缩的子文件夹
foreach (DirectoryInfo subDi in vItem.Now.GetDirectories())
{
vQueue.Enqueue(new ZipDirectory(vItem.Base, subDi));
}
}
//添加需要压缩的文件
foreach (string vFile in this.Files)
{
if (!File.Exists(vFile))
{
continue;
}
FileInfo vInfo = new FileInfo(vFile);
vZipFiles.Enqueue(GetZipPath(string.Empty, vInfo));
}
return vZipFiles;
}
/// <summary>
/// 获取需要文件以及需要压缩的文件的相对目录
/// </summary>
/// <param name="vZipDirectory">相对目录信息</param>
/// <param name="vInfo">需要压缩的文件</param>
/// <returns></returns>
private ZipPath GetZipPath(string vZipDirectory, FileInfo vInfo)
{
ZipPath vItem = new ZipPath();
vItem.ZipDirectory = vZipDirectory;
vItem.ZipFile = Path.Combine(vZipDirectory, vInfo.Name);
vItem.File = vInfo.FullName;
vItem.Directory = vInfo.DirectoryName;
return vItem;
}
#endregion
/// <summary>
/// 压缩文件
/// </summary>
public void Zip()
{
this.Zip(string.Empty);
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="vPwd">压缩文件的密码</param>
public void Zip(string vPwd)
{
int vLevel = 3; // 压缩级别 0-9
if (string.IsNullOrEmpty(this.ZipFile))
{
return;
}
string vZipDic = Path.GetDirectoryName(this.ZipFile);
if (!Directory.Exists(vZipDic))
{
Directory.CreateDirectory(vZipDic);
}
Queue<ZipPath> vZips = this.GetZipPaths();
int vTotal = vZips.Count;
ZipInfo vZipInfo = null;
using (ZipOutputStream s = new ZipOutputStream(File.Create(this.ZipFile)))
{
s.SetLevel(vLevel); // 压缩级别 0-9
if (!string.IsNullOrEmpty(vPwd))
{
s.Password = vPwd;
}
ByteHelper vByteUtil = new ByteHelper();
while (vZips.Count > 0)
{
ZipPath vItem = vZips.Dequeue();
int vPos = vTotal - vZips.Count;
ZipEntry entry = new ZipEntry(vItem.ZipFile);
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
FileInfo vFileInfo = new FileInfo(vItem.File);
vZipInfo = new ZipInfo(vFileInfo.DirectoryName, vFileInfo.FullName, vFileInfo.Length, vPos, vTotal);
this.Trigger(this.ItemZiping, vZipInfo, true);
try
{
using (FileStream fs = File.OpenRead(vItem.File))
{
vByteUtil.CopyStream(fs, s);
}
}
catch (Exception ex)
{
LogHelper.WriteLog(ex);
this.Trigger(this.Error, vZipInfo, false);
}
this.Trigger(this.ItemZiped, vZipInfo, true);
}
s.Finish();
s.Close();
}
this.Trigger(this.Ziped, vZipInfo, true);
}
/// <summary>
/// 获取需要压缩的文件的目录信息
/// </summary>
/// <returns></returns>
private Queue<ZipPath> GetZipPaths()
{
Queue<ZipPath> vZipFiles = new Queue<ZipPath>();
//添加需要处理的文件夹队列
Queue<ZipDirectory> vQueue = new Queue<ZipDirectory>();
//初始化需要压缩的队列
foreach (string vItem in this.Directors)
{
//当文件夹不存在时
if (!Directory.Exists(vItem))
{
continue;
}
DirectoryInfo di = new DirectoryInfo(vItem);
vQueue.Enqueue(new ZipDirectory(di, di));
}
//处理文件夹中的子文件夹,并且添加到需要压缩的文件
while (vQueue.Count > 0)
{
ZipDirectory vItem = vQueue.Dequeue();
foreach (FileInfo vInfo in vItem.Now.GetFiles())
{
string vZipDirectory = string.Empty;
string vNowName = vItem.Now.FullName;
string vBaseName = vItem.Base.FullName;
if (vNowName != vBaseName)
{
vZipDirectory = vNowName.Substring(vBaseName.Length + 1);
}
vZipFiles.Enqueue(GetZipPath(vZipDirectory, vInfo));
}
//添加需要压缩的子文件夹
foreach (DirectoryInfo subDi in vItem.Now.GetDirectories())
{
vQueue.Enqueue(new ZipDirectory(vItem.Base, subDi));
}
}
//添加需要压缩的文件
foreach (string vFile in this.Files)
{
if (!File.Exists(vFile))
{
continue;
}
FileInfo vInfo = new FileInfo(vFile);
vZipFiles.Enqueue(GetZipPath(string.Empty, vInfo));
}
return vZipFiles;
}
/// <summary>
/// 获取需要文件以及需要压缩的文件的相对目录
/// </summary>
/// <param name="vZipDirectory">相对目录信息</param>
/// <param name="vInfo">需要压缩的文件</param>
/// <returns></returns>
private ZipPath GetZipPath(string vZipDirectory, FileInfo vInfo)
{
ZipPath vItem = new ZipPath();
vItem.ZipDirectory = vZipDirectory;
vItem.ZipFile = Path.Combine(vZipDirectory, vInfo.Name);
vItem.File = vInfo.FullName;
vItem.Directory = vInfo.DirectoryName;
return vItem;
}
#endregion