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 [参数] [打包后的文件名] [打包的目 ...
随机推荐
- SQL Server 常用命令使用方法
(1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * f ...
- python day 1--python初始
笔者:QQ: 360212316 Python初识 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...
- [JSP]用户注册
//----------------------userRegister.jsp <%@ page contentType="text/html;charset=gb2312" ...
- unity5.0新功能-布料、动画系统
原作者:只待苍霞 这一章讲一下布料系统, 这次的布料系统有很大的改良.Unity4中, 需要对SkinnedMeshRenderer使用SkinnedCloth, 或者对Cloth Renderer使 ...
- QT学习入门笔记
系统路径 path 添加dll路径,如D:\QT\5.4\mingw491_32. .pro 文件添加 QT += widgets,否则出现qapplication no such file or ...
- unity3d 孤岛求生基础案例
第二个案例,此案例主要实现了第一人称控制器,把移动从世界坐标系转化到人物平面坐标系,通过碰撞器,触发器,光线透射触发器实现交互.实现UI texture记录收集信息,ui texture是更新内容对应 ...
- oracle sql改写
or可以改写成union 但是要注意,改写成union的时候一定要有一个唯一列参照,不然会少记录,因为union会去重. 可以用的唯一列:唯一索引列,主键列,rowid,rownum(视图里用这个)
- Unity Application 前后台切换调用关系
[Unity Application 前后台切换调用关系] http://blog.csdn.net/aa4790139/article/details/48087877
- Java堆、栈和常量池以及相关String的详细讲解(经典中的经典) (转)
原文链接 : http://www.cnblogs.com/xiohao/p/4296088.html 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的 ...
- 可以让电脑卡机的c++程序
#include <iostream> #include<windows.h> #include <shellapi.h> #include <stdio.h ...