【C#】依赖于SharpZipLib的Zip压缩工具类
上班第二天下班,课外作业,实现一个ZIP压缩的工具类.本来想用Package,但是写完了才发现不能解压其他工具压缩的zip包,比较麻烦,因此本工具类依赖了第三方的库(SharpZipLib version 0.86.0 http://icsharpcode.github.io/SharpZipLib/),上午花了两个小时整理了下代码,mark下!
/**
* Class: ZIP压缩工具类
* Reference: SharpZipLib version 0.86.0 (http://icsharpcode.github.io/SharpZipLib/)
* Author: Zengyq
* Version: 1.0
* Create Date: 2014-05-13
* Modified Date: 2014-05-14
*/ /****************构造函数*************************/
ZipUtils()
ZipUtils(int compressionLevel) /****************方法列表*************************/
/// <summary>
/// 功能: ZIP方式压缩文件(压缩目录)
/// </summary>
/// <param name="dirPath">被压缩的文件夹夹路径</param>
/// <param name="zipFilePath">生成压缩文件的路径,缺省值:文件夹名+.zip</param>
/// <param name="msg">返回消息</param>
/// <returns>是否压缩成功</returns>
public bool ZipFolder(string dirPath, string zipFilePath, out string msg) /// <summary>
/// 功能:压缩文件指定文件
/// </summary>
/// <param name="filenames">要压缩文件的绝对路径</param>
/// <param name="zipFilePath">生成压缩文件的路径, 缺省值为随机数字串.zip</param>
/// <param name="msg">返回消息</param>
/// <returns>是否压缩成功</returns>
public bool ZipFiles(string[] filenames, string zipFilePath, out string msg) /// <summary>
/// 解压ZIP格式的文件。
/// </summary>
/// <param name="zipFilePath">压缩文件路径</param>
/// <param name="unZipDir">解压文件存放路径,缺省值压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
/// <param name="msg">返回消息</param>
/// <returns>解压是否成功</returns>
public bool UnZipFile(string zipFilePath, string unZipDir, out string msg) /// <summary>
/// 解压指定ZIP文件到当前路径
/// </summary>
/// <param name="zipFilePath">ZIP文件绝对路径</param>
/// <param name="msg">返回消息</param>
/// <returns>解压是否成功</returns>
public bool UnZipFileToCurrentPath(string zipFilePath, out string msg) /****************调用样例*************************/
ZipUtils zu = new ZipUtils();
string msg = "";
zu.UnZipFileToCurrentPath(@"C:\Users\zengyiqun\Desktop\package1024.zip", out msg);
类实现,没有采用静态类的形式,看了某博客用了out作为msg不懂会不会用到,先这样了,以下是实现类:
/**
* Class: ZIP压缩工具类
* Reference: SharpZipLib version 0.86.0 (http://icsharpcode.github.io/SharpZipLib/)
* Author: Zengyq
* Version: 1.0
* Create Date: 2014-05-13
* Modified Date: 2014-05-14
*/ using ICSharpCode.SharpZipLib.Zip;
using System;
using System.IO; public class ZipUtils
{
//缓存大小
private int BufferSize; //压缩率 0(无压缩)-9(压缩率最高)
private int CompressionLevel; //压缩是用于存放压缩路径
private string CompressPath; #region 构造函数
/// <summary>
/// 无参构造
/// </summary>
public ZipUtils()
{
this.BufferSize = ;
this.CompressionLevel = ;
} /// <summary>
/// 带参数构造
/// </summary>
/// <param name="compressionLevel">0(无压缩)-9(压缩率最高)</param>
public ZipUtils(int compressionLevel)
{
this.BufferSize = ;
this.CompressionLevel = compressionLevel;
}
#endregion #region 压缩方法
/// <summary>
/// 功能: ZIP方式压缩文件(压缩目录)
/// </summary>
/// <param name="dirPath">被压缩的文件夹夹路径</param>
/// <param name="zipFilePath">生成压缩文件的路径,缺省值:文件夹名+.zip</param>
/// <param name="msg">返回消息</param>
/// <returns>是否压缩成功</returns>
public bool ZipFolder(string dirPath, string zipFilePath, out string msg)
{
this.CompressPath = dirPath;
//判断目录是否为空
if (dirPath == string.Empty)
{
msg = "The Folder is empty";
return false;
} //判断目录是否存在
if (!Directory.Exists(dirPath))
{
msg = "The Folder is not exists";
return false;
} //压缩文件名为空时使用 文件夹名.zip
if (zipFilePath == string.Empty || zipFilePath == null)
{
if (dirPath.EndsWith("//"))
{
dirPath = dirPath.Substring(, dirPath.Length - );
}
zipFilePath = dirPath + ".zip";
} try
{
using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
{
s.SetLevel(this.CompressionLevel);
ZipDirectory(dirPath, s);//压缩目录,包含子目录
s.Finish();
s.Close();
}
}
catch (Exception ex)
{
msg = ex.Message;
return false;
} msg = "Success";
return true;
}//end function /// <summary>
/// 压缩文件指定文件
/// </summary>
/// <param name="filenames">要压缩文件的绝对路径</param>
/// <param name="zipFilePath">生成压缩文件的路径, 缺省值为当前时间.zip</param>
/// <param name="msg">返回消息</param>
/// <returns>是否压缩成功</returns>
public bool ZipFiles(string[] filenames, string zipFilePath, out string msg)
{
msg = "";
if (filenames.Length == )
{
msg = "No File Selected";
return false;
} //压缩文件名为空时使用 文件夹名.zip
if (zipFilePath == string.Empty || zipFilePath == null)
{
zipFilePath = System.Environment.CurrentDirectory + "\\" + DateTime.Now.ToFileTimeUtc().ToString() + ".zip";
} try
{
using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
{
s.SetLevel(this.CompressionLevel);
ZipFilesAndDirectory(filenames,s);
s.Finish();
s.Close();
}//end using
}
catch (Exception ex)
{
msg = ex.Message;
return false;
} msg = "Success";
return true;
} #endregion #region 解压方法
/// <summary>
/// 解压ZIP格式的文件。
/// </summary>
/// <param name="zipFilePath">压缩文件路径</param>
/// <param name="unZipDir">解压文件存放路径,缺省值压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
/// <param name="msg">返回消息</param>
/// <returns>解压是否成功</returns>
public bool UnZipFile(string zipFilePath, string unZipDir, out string msg)
{
msg = ""; //判读路径是否为空
if (zipFilePath == string.Empty || zipFilePath == null)
{
msg = "ZipFile No Selected";
return false;
} //判读文件是否存在
if (!File.Exists(zipFilePath))
{
msg = "ZipFile No Exists";
return false;
}
//解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
if (unZipDir == string.Empty || unZipDir == null)
{
unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
} if (!unZipDir.EndsWith("//"))
{
unZipDir += "//";
} if (!Directory.Exists(unZipDir))
{
Directory.CreateDirectory(unZipDir);
} try
{
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 (directoryName.Length > )
{
Directory.CreateDirectory(unZipDir + directoryName);
}
if (!directoryName.EndsWith("//"))
{
directoryName += "//";
}
if (fileName != String.Empty && fileName != null)
{
using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
{
CopyStream(s, streamWriter);
}
}
}//end while
}//end using
}
catch (Exception ex)
{
msg = ex.Message;
return false;
} msg = "UnZip Success ! ";
return true;
}//end function /// <summary>
/// 解压指定ZIP文件到当前路径
/// </summary>
/// <param name="zipFilePath">ZIP文件绝对路径</param>
/// <param name="msg">返回消息</param>
/// <returns>解压是否成功</returns>
public bool UnZipFileToCurrentPath(string zipFilePath, out string msg)
{
msg = ""; //判读路径是否为空
if (zipFilePath == string.Empty || zipFilePath == null)
{
msg = "ZipFile No Selected";
return false;
} //判读文件是否存在
if (!File.Exists(zipFilePath))
{
msg = "ZipFile No Exists";
return false;
}
//解压到当前目录
string unZipDir = zipFilePath.Substring(, zipFilePath.LastIndexOf(@"\")); if (!unZipDir.EndsWith("//"))
{
unZipDir += "//";
} if (!Directory.Exists(unZipDir))
{
Directory.CreateDirectory(unZipDir);
} try
{
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 (directoryName.Length > )
{
Directory.CreateDirectory(unZipDir + directoryName);
}
if (!directoryName.EndsWith("//"))
{
directoryName += "//";
}
if (fileName != String.Empty && fileName != null)
{
using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
{
CopyStream(s, streamWriter);
}
}
}//end while
}//end using
}
catch (Exception ex)
{
msg = ex.Message;
return false;
} msg = "UnZip Success ! ";
return true;
}//end function #endregion #region 内部方法 /// <summary>
/// 内部类:递归压缩目录
/// </summary>
/// <param name="dirPath"></param>
/// <param name="s"></param>
private void ZipDirectory(string dirPath, ZipOutputStream s)
{
string[] filenames = Directory.GetFiles(dirPath);
byte[] buffer = new byte[this.BufferSize];
foreach (string file in filenames)
{
//处理相对路径问题
ZipEntry entry = new ZipEntry(file.Replace(this.CompressPath + "\\", String.Empty));
//设置压缩时间
entry.DateTime = DateTime.Now; s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
CopyStream(fs, s);
}
} //递归处理子目录
DirectoryInfo di = new DirectoryInfo(dirPath);
foreach (DirectoryInfo subDi in di.GetDirectories())
{
ZipDirectory(subDi.FullName, s);
} }//end function /// <summary>
///
/// </summary>
/// <param name="filenames"></param>
/// <param name="s"></param>
private void ZipFilesAndDirectory(string[] filenames, ZipOutputStream s)
{
byte[] buffer = new byte[this.BufferSize];
foreach (string file in filenames)
{
//当时文件的时候
if (System.IO.File.Exists(file))
{
ZipEntry entry = new ZipEntry(Path.GetFileName(file));
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
CopyStream(fs, s);
}
} //当时目录的时候
if(System.IO.Directory.Exists(file))
{
this.CompressPath = file.Replace("\\" + Path.GetFileName(file),String.Empty);
ZipDirectory(file, s);
} } } /// <summary>
/// 按块复制
/// </summary>
/// <param name="source">源Stream</param>
/// <param name="target">目标Stream</param>
private void CopyStream(Stream source, Stream target)
{
byte[] buf = new byte[this.BufferSize];
int byteRead = ;
while ((byteRead = source.Read(buf, , this.BufferSize)) > )
{
target.Write(buf, , byteRead);
} }
#endregion }//end class
代码风格还请大家轻喷,在.net程序员面前是个非主流java程序员,在java程序员面前是个非主流.net程序员。将以上工具类封装成了dll可以直接引用。
附件:ZipUtils.rar
1 ZipUtils.rar
2 -src
3 -ZipUtils.cs
4 -dll
5 -SharpZipLib.dll
6 -ZipUtilsLib.dll
【C#】依赖于SharpZipLib的Zip压缩工具类的更多相关文章
- 最近工作用到压缩,写一个zip压缩工具类
package test; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream ...
- zip压缩工具类
java将有关zip压缩的内容都封装在java.util.zip宝中,用java实现zip压缩,不用考虑压缩算法,java已经将这些进行了封装 实际上用java实现zip压缩涉及的就是一个“输入输出流 ...
- 压缩工具类 - ZipUtils.java
压缩工具类,提供压缩文件.解压文件的方法. 源码如下:(点击下载 - ZipUtils.java .FolderUtils.java.ant-1.7.0.jar.commons-io-2.4.jar. ...
- Java 实现文件压缩工具类
package com.wdxc.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileI ...
- php ZIP压缩类实例分享
php ZIP压缩类实例分享 <?php $zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt ...
- zip压缩工具 tar打包 打包并压缩
6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 zip压缩工具 xz,bzip2,gzip都不支持压缩目录 zip可以压缩目录 压缩文件 zip 2.txt.zip 2.txt [ ...
- zip压缩工具,unzip解压缩工具
zip压缩工具,unzip解压缩工具=================== [root@aminglinux tmp]# yum install -y zip[root@aminglinux tmp] ...
- Zip压缩工具、tar打包、打包并压缩
第5周第2次课(4月17日) 课程内容: 6.5 zip压缩工具6.6 tar打包6.7 打包并压缩 6.5 zip压缩工具 Zip压缩工具最大的特点就是可以支持压缩目录,也能够压缩文件,Window ...
- Resource注解无法导入依赖使用javax.annotation的注解类
Resource注解无法导入依赖使用javax.annotation的注解类 使用javax.annotation的注解类 javax.annotation.Resource 注解在eclipse中无 ...
随机推荐
- uva 699 the falling leaves——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3QAAAMsCAIAAACTL3d2AAAgAElEQVR4nOx9y7GuPA4tKRADk/92T8 ...
- 数论+spfa算法 bzoj 2118 墨墨的等式
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1283 Solved: 496 Description 墨墨突然对等式很感兴 ...
- 最小瓶颈路 Uva 534 Frogger
说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ...
- 二分法 organ Saltless
organ [描述] 现在某组织中(记作R)有n个人,他们的联络网形成一棵以Saltless为根的树,有边相连代表两人可以直接联络. 每个人有一个代号,Saltless代号为1,且除Saltless外 ...
- 记忆化搜索 codevs 2241 排序二叉树
codevs 2241 排序二叉树 ★ 输入文件:bstree.in 输出文件:bstree.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 一个边长为n的正三 ...
- codeforces 712B B. Memory and Trident(水题)
题目链接: B. Memory and Trident time limit per test 2 seconds memory limit per test 256 megabytes input ...
- css中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
例如: .my_table tr:nth-child(even){ background:#E6EDF5; } .my_table tr:nth-child(odd){ background:#F0F ...
- HDU 4454 Stealing a Cake --枚举
题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离. 解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离 ...
- java 15-4 集合的专用遍历工具 迭代器
Iterator iterator():迭代器,集合的专用遍历方式 A:Object next():获取元素,并移动到下一个位置. 有时候会出现这样的错误: NoSuchElementExceptio ...
- Google play billing(Google play 内支付)
准备工作 1. 通过Android SDK Manager下载extras中的Google Play services和Google Play Billing Library两个包. 2. 把下载的. ...