【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中无 ...
随机推荐
- linux安装hadoop 1.2.1
我的服务器里面会装很多东西,所以我在跟目录下面建立了个doc文档文件夹 1.创建存放软件的doc文件夹 mkdir doc 2.进去doc文件夹进行下载hadoop-1.2.1资源包或者到我的百度云下 ...
- [转]Ionic 实现双击返回键退出功能
本文转自:http://ionichina.com/topic/5514b539b6421f9166aa5f88 一.准备 Toast插件 插件地址:cordova plugin add https: ...
- [麦先生]LINUX常用命令总结
在系统的学习了如何搭建和利用LINUX进行开发后,我利用xMind这一个强大的bug级软件制作了LINUX常见操作命令汇总,但是由于博客园并不支持xMind格式文件的上传,我只能将其做成图片进行分解上 ...
- 【Android Demo】获取指定网页的页面源代码
1.直接上效果图 2.代码 主要就是工具类HtmlService.java: import java.io.ByteArrayOutputStream; import java.io.InputStr ...
- Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】
题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...
- 使用友盟进行apk的自动更新
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 第51课 C++对象模型分析(下)
1. 单继承对象模型 (1)单一继承 [编程实验]继承对象模型初探 #include <iostream> using namespace std; class Demo { protec ...
- 第23章 SEH结构化异常处理(3)_终止处理程序
23.3 终止处理程序 23.3.1 程序的结构 (1)框架 __try{ //被保护的代码块 …… } __finally{ //终止处理 } (2)__try/__finally的特点 ①fina ...
- maya获取邻接顶点的一个问题
maya网格数据结构允许"非流形"的存在,于是,这种数据结构无法按顺序给出一个点的邻接顶点. 于是,MItMeshVertex::getConnectedVertices函数返回的 ...
- 判断变量是否为json对象
var m ={a:'A'}; if(typeof m == 'object' && JSON.stringify(m).indexOf('{') == 0){//判断变量m是不是js ...