【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中无 ...
随机推荐
- 【问题&解决】sql2012安装时卡在正在启动操作系统功能"NetFx3"上不动的解决办法
安装完windows8 后开始安装sql2012,安装过程中停在“正在启动操作系统功能"NetFx3"”不动了,很是着急,于是上网查了一下资料,原来NetFx3指的是Framewo ...
- Rem实现自适应初体验
第一次做移动端的页面,遇到的第一个问题就是移动端的轮播图.其实轮播图的插件有很多,但是完全满足需求的并不容易找. 需求: 1.实现基本的触屏轮播图效果 2.传入非标准比例的图片,可以自动平铺(有时候图 ...
- HDU 4045 Machine scheduling --第二类Strling数
题意: n个数(1~n)取出r个数,取出的数相差要>=k, 然后分成m个可空组,问有多少种情况. 解法: 先看从n个数中取r个相差>=k的数的方法数,可以发现 dp[i][j] = dp[ ...
- Treap(树堆):随机平衡二叉树实现
本文是根据郭家宝的文章<Treap的原理及实现>写的. #include<stdio.h> #include<string.h> #include<stdli ...
- Jenkins学习一:Jenkins是什么?
文章转载:http://www.cnblogs.com/zz0412/tag/jenkins/default.html?page=1 第一章 Jenkins是什么? Jenkins 是一个可扩展的持续 ...
- java8-1 final
1.final可以修饰类,方法,变量 特点: final可以修饰类,该类不能被继承. final可以修饰方法,该方法不能被重写.(覆盖,复写) final可以修饰变量,该变量不能被重新赋值.因为这个变 ...
- Corotational 模型代码
今天看了Corotational模型的代码. 在Vega中,获得模型内力的方法是先构造一个ForceModel对象,再调用其对应方法. 对于Corotational模型,构造的流程为: 构造Corot ...
- 运维工作中常用到的几个rsync同步命令
作为一个运维工程师,经常可能会面对几十台.几百台甚至上千台服务器,除了批量操作外,环境同步.数据同步也是必不可少的技能.说到“同步”,不得不提的利器就是rsync. 下面结合本人近几年运维工作中对这一 ...
- CSS3弹性伸缩布局(一)——box布局
CSS3弹性伸缩布局简介 2009年,W3C提出了一种崭新的方案----Flex布局(即弹性伸缩布局),它可以简便.完整.响应式地实现各种页面布局,包括一直让人很头疼的垂直水平居中也变得很简单地就迎刃 ...
- usb驱动开发8之配置描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置. 我 ...