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 [参数] [打包后的文件名] [打包的目 ...
随机推荐
- python的类与对象
类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...
- AJAX原生JS代码
var http_request = false;function send_request(method,url,content,responseType,callback){ http_reque ...
- php电话号码正则表达式常用例子
电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) 02 03 ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{ ...
- HTML5 CANVAS画图 beginPath和closePath
beginPath这个canvas函数我很早就讲过了,他的作用很简单,就是开始一段新路径,我们先来看下面的一小段代码: var ctx = document.getElementById('cvs') ...
- 写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、
描述:做了两个页面login.html index.html 在index的body加了onload事件,调用一个js,js中有cookie的判断,防止没有登录就打开index.html,如果没 ...
- 位段(bitfield)
struct { unsigned int fieldA : 4 ; unsigned int fieldB : 2 ; unsigned int ...
- 史航第12次作业&总结
作业1:找出最长的字符串 #include <stdio.h> #include <string.h> int main() { ],strings[][]; ; printf ...
- Python—判断变量的基本类型
type() >>> type(123)==type(456) True >>> type(123)==int True >>> type('ab ...
- Could not synchronize database state with session
今天做一个简单保存时,db2数据库报的错误,网上收集了下问题的解决办法~ 1.主键不是自动生成的,然后自己没手动设置. 2.插入的实体字段跟数据库的关键字冲突. 3.更新的时候,如果更新一个不存在的i ...
- hdu 3579 Hello Kiki (中国剩余定理)
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...