Zip压缩和解压缩
这个功能完全依靠一个第三方的类,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压缩和解压缩的更多相关文章
- Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)
1.压缩和解压缩命令 常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令 zip 压缩文件名 源文件:压缩文件 ...
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
reference : http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...
- Java 的zip压缩和解压缩
Java 的zip压缩和解压缩 好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代 ...
- IO操作之使用zip包压缩和解压缩文件
转自:http://www.cdtarena.com/java.htmlJava API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...
- Java用ZIP格式压缩和解压缩文件
转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...
- 使用commons-compress操作zip文件(压缩和解压缩)
http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...
- java采用zip方式实现String的压缩和解压缩CompressStringUtil类
CompressStringUtil类:不多说,直接贴代码: /** * 压缩 * * @param paramString * @return */ public static final byte ...
- Java对zip格式压缩和解压缩
Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...
- Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)
Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 学习了:http://www.tuicool.com/articles/V7BBvy 引用原文: JDK中自带的ZipOutputStrea ...
- 【转载】 Linux常用命令: zip、unzip 压缩和解压缩命令
Linux常用命令: zip.unzip 压缩和解压缩命令 Linux常用命令: zip.unzip 压缩和解压缩命令 zip的用法 基本用法是: zip [参数] [打包后的文件名] [打包的目 ...
随机推荐
- sass揭秘之@mixin,%,@function
因为文章内含有很多sass代码,如需自己动手查看编译结果,推荐使用sassmeister这款在线编译工具,方便你阅读学习. 在阅读本文章之前,请先确认你已经阅读了上篇文章sass揭秘之变量,不然会给你 ...
- python--day2--基础数据类型与变量
笔者:QQ: 360212316 python控制语句 for循环语句示例: for i in range(10): print(i) for循环语句示例1: for i in range(10) ...
- Oracle数据库like和not like使用
查询手机号注册的记录而不是邮箱 查询2开头的记录 select * from beyond_pay_offline where amount like '2%'
- iOS如何监听弱网?
场景: iOS中我们可能经常用到监听网络,不过大部分是监听网络的类型,即2G/3G/4G WIFI,是否连接网络,然而测试人员对APP进行测试时候经常会有一个弱网测试,即在弱网环境下对APP进行测试, ...
- 【SVN】Error running context: 由于目标计算机积极拒绝,无法连接
SVN服务没开启,步骤如下: 1.打开[控制面板]→[管理工具]→[服务]: 2.找到[visual SVN Sever],右击选择[启动]: 3.服务开启后,导入数据就成功了!
- js中var self=this的解释
每个函数在定义被ECMAScript解析器解析时,都会创建两个特殊的变量:this和arguments,换句话说,每个函数都有属于自己的this对象,这个this对象是在运行时基于函数的执行环境绑定的 ...
- spring 异常记录
1.异常: java.lang.IllegalArgumentException: No converter found for return value of type: class java.ut ...
- JS获取指定的cookie值
cookie Name为TEST_COOKIE:用如下方法可以获取cookie值: document.cookie.replace(/(?:(?:^|.*;\s*)TEST_COOKIE\s*\=\s ...
- MySql索引简介
从"找"到B+树 索引是用来查找的. 折半查找是一种很优秀的方式.适合于 范围查找,固有缺点就是需要元素是有序的.二叉搜索树就是对折半查找的一种基础的实现. 但二叉搜索树当遇到特殊 ...
- iOS之分别使用代码和storyboard、xib为控件设置圆角(以按钮为例)
首先我们看一下代码是如何给按钮设置圆角的: 我们再来看看如何在storyboard或xib中给按钮设置圆角: 1.在storyboard或xib中添加按钮后,设置标题和背景色,做好约束: 2.点击 S ...