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 [参数] [打包后的文件名] [打包的目 ...
随机推荐
- Handlebars模板库浅析
Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...
- libsvm参数学习和核函数使用(转载)
一.参数说明 English libsvm_options: -s svm_type : set type of SVM (default 0) 0 -- C-SVC 1 -- nu-S ...
- RPC 框架通信原理
RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据: ...
- android studio中如何设置注释模板
在开发程序的时候,我们一般都会给文件自动添加上一些关于文件的注释信息,比如开发者的名字,开发的时间,开发者的联系方式等等.那么在android studio中该如何设置呢? 工具/原料 andro ...
- FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展
一.出现如下两个错误:1.某一段SQL语句执行时间超过1个小时:2.一个小时后,提示如下错误:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展 temp 段ORA-065 ...
- oracle 数据库的学习1
1.oracle 数据库常用的基本类型 char(10) -->存储固定长度的字符串 varchar2(10)-->存储可变长的字符串 Date INTEGER -->存储整数 N ...
- iOS之分别使用代码和storyboard、xib为控件设置圆角(以按钮为例)
首先我们看一下代码是如何给按钮设置圆角的: 我们再来看看如何在storyboard或xib中给按钮设置圆角: 1.在storyboard或xib中添加按钮后,设置标题和背景色,做好约束: 2.点击 S ...
- 关于js原型继承
js的每个类都有一个prototype对象 访问对象的属性时,会先访问到对象自身是否有定义这个属性 如果没有定义,就会去访问对象所属类型的prototype对象是否有此属性 原型继承就是把类型的pro ...
- Java基础知识系列——日期
日期类型也是在编程中经常用到的一种数据类型. Java中的日期类型为Date. 另外需要记住三个类: java.text.SimpleDateFormat; java.util.Calendar; j ...
- Eclipse各种配置
1.配置工作空间编码 Window -- Preferences-- Genereal -- Workspace (Text file encoding -- orther -- utf-8) 2 ...