这个功能完全依靠一个第三方的类,ICSharpCode.SharpZipLib.dll,只是在网上搜了大半天,都没有关于这个类的详细解释,搜索的demo也是各种错误,感觉作者完全没有跑过,就那么贸贸然的贴出来了。当然这个功能的实现也是基于前人的Demo,感恩!

我创建的是个Windows窗体应用程序取名为ZipDemo。

  1. 拖了2个文本框,4个按钮

  2. 添加引用ICSharpCode.SharpZipLib.dll

  3. 压缩的代码

        //选择文件夹
private void btnOpen_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();//打开文件夹
if (dialog.ShowDialog() != DialogResult.OK)
{
return;
}
txtPath.Text = dialog.SelectedPath;
}
//开始压缩
private void btnZip3_Click(object sender, EventArgs e)
{
ZipOutputStream zipStream = new ZipOutputStream(File.Create(Path.GetFileName(txtPath.Text) + ".zip"));//压缩到Debug中
AddZip3(txtPath.Text, ref zipStream);
zipStream.Finish();
zipStream.Close();
MessageBox.Show("压缩完成");
}
//递归压缩
void AddZip3(string path, ref ZipOutputStream zipStream)
{
//如果是文件,则压缩
if (File.Exists(path))
{
zipStream.SetLevel(); //压缩等级
FileStream f = File.OpenRead(path);
byte[] b = new byte[f.Length];
f.Read(b, , b.Length); //将文件流加入缓冲字节中
string filePath = path.Replace(txtPath.Text, string.Empty).Remove(, );//取相对路径,并且去掉前面的/,否则压缩的文件和文件夹名称前都会加个/
ZipEntry z = new ZipEntry(filePath);//如果是文件夹下的文件,会自动创建文件夹
zipStream.PutNextEntry(z); //为压缩文件流提供一个容器
zipStream.Write(b, , b.Length); //写入字节
f.Close();
}
//如果是文件夹,则循环里面的文件和文件夹
if (Directory.Exists(path))
{
DirectoryInfo di = new DirectoryInfo(path);
foreach (var item in di.GetDirectories())
{
AddZip3(item.FullName, ref zipStream);
}
foreach (var item in di.GetFiles())
{
AddZip3(item.FullName, ref zipStream);
}
}
}

压缩

  4. 解压缩的代码

        //选择文件
private void btnOpenFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() != DialogResult.OK)
{
return;
}
txtFile.Text = ofd.FileName;
}
private void btnUnZip_Click(object sender, EventArgs e)
{
string path = txtFile.Text;
string un_dir = Path.GetFileNameWithoutExtension(path);//文件的名称
Directory.CreateDirectory(un_dir); //创建以压缩包为名称的文件夹
ZipInputStream f = new ZipInputStream(File.OpenRead(path)); //读取压缩文件,并用此文件流新建 “ZipInputStream”对象
ZipEntry zp; //获取解压文件流中的项目
while ((zp = f.GetNextEntry()) != null)//循环读取每个文件
{
string filePath = Path.Combine(un_dir, zp.Name);
string dirPath = Path.GetDirectoryName(filePath);
if (!zp.IsDirectory && zp.Crc != 00000000L) //此“ZipEntry”不是“标记文件”
{
int i = *;
byte[] b = new byte[i]; //每次缓冲 2048*2 字节
if (!Directory.Exists(dirPath))//存在子文件夹,必须先创建文件夹,否则会报错,无法自动创建文件夹
{
Directory.CreateDirectory(dirPath);
}
FileStream s = File.Create(filePath); //新建文件流
while (true) //持续读取字节,直到一个“ZipEntry”字节读完
{
i = f.Read(b, , b.Length); //读取“ZipEntry”中的字节
if (i > )
{
s.Write(b, , i); //将字节写入新建的文件流
}
else
{
break; //读取的字节为 0 ,跳出循环
}
}
s.Close();
}
}
MessageBox.Show("解压缩OK");
}

解压缩

这个Demo是跑过的,Demo压缩的文件WinRAR是可以打开,其他Zip压缩文件Demo也是可以解压缩的。

如果发现解压缩报错的话,先看看,解压缩的文件是不是zip格式。

Zip压缩和解压缩的更多相关文章

  1. Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)

    1.压缩和解压缩命令    常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令        zip 压缩文件名 源文件:压缩文件   ...

  2. [Java 基础] 使用java.util.zip包压缩和解压缩文件

    reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...

  3. Java 的zip压缩和解压缩

    Java 的zip压缩和解压缩 好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代 ...

  4. IO操作之使用zip包压缩和解压缩文件

    转自:http://www.cdtarena.com/java.html​​Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...

  5. Java用ZIP格式压缩和解压缩文件

    转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...

  6. 使用commons-compress操作zip文件(压缩和解压缩)

    http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...

  7. java采用zip方式实现String的压缩和解压缩CompressStringUtil类

    CompressStringUtil类:不多说,直接贴代码: /** * 压缩 * * @param paramString * @return */ public static final byte ...

  8. Java对zip格式压缩和解压缩

    Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...

  9. Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)

    Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 学习了:http://www.tuicool.com/articles/V7BBvy 引用原文: JDK中自带的ZipOutputStrea ...

  10. 【转载】 Linux常用命令: zip、unzip 压缩和解压缩命令

    Linux常用命令: zip.unzip 压缩和解压缩命令   Linux常用命令: zip.unzip 压缩和解压缩命令 zip的用法 基本用法是: zip [参数] [打包后的文件名] [打包的目 ...

随机推荐

  1. HTML5 canvas beginPath() 方法

    beginPath() 方法开始一条路径,或重置当前的路径.w3school上的解释! 路径是canvas里很重要的一个概念,刚开始学canvas的人对路径理解不是很深,他们在用canvas的时候会乱 ...

  2. ubuntu apt 安装

    1. ./autogen.sh: libtoolize: not found sudo apt-get install aptitude sudo aptitude install libtool 2 ...

  3. LDAP客户端

    LDAP客户端通过与服务端关联起来,就可以使用服务端的系统账号登录系统,通过useradd 添加用户是在ldap里是没有显示的,ldap添加用户,在/etc/passwd里也是没有显示的,ldap添加 ...

  4. 串口控RGB三色灯

    本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:串口控RGB三色灯 使用函数: Serial.flush(); / ...

  5. ajax将json写到table中去

    查询条件: <table style="width: 100%;border-collapse: collapse;" > <tr> <th styl ...

  6. 安卓开发 想要获取某个View的高度(我是在做滚动浮层的时候用到的)

    1.activity中有个onWindowFocusChanged()方法,可以获取控件的大小,别的地方可能会调用过早导致获取不到实际的大小 @Override public void onWindo ...

  7. 纯JS实现中国行政区域上下联动选择地址

    一.实现目的: 如标题所述,通过JS来实现地址的选取,上一篇博客介绍的方式是通过java读取txt资源文件来实现地址的选择,通过ajax方式访问服务器实现省市区联动.此篇中将介绍如何使用JS实现相同功 ...

  8. VMware Workstation+Linux+Xshell+Xftp+MySQL+SQLyog 配置

    这些天在搞这些个东西做项目,配置较繁,这里记下安装过程中的要点. 1.VMware Workstation 主要是 NAT 方式联网的问题,详述如下,来自网络. NAT 配置那里注意网关,虚拟机中网关 ...

  9. MVC Html.ValidationSummary()样式优化

    先看效果图 在MVC中常用ValidationSummary显示校验信息,默认样式为 针对Html.ValidationSummary()如何做优化 样式一: 在MVC中,如果你使用验证总结方法任何验 ...

  10. Oracle循环查询结果集 自定义函数

    create or replace function Fun_GetRoleIDList(d_fid char) return varchar is  rolelist varchar(2000);b ...