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

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

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

  2. 添加引用ICSharpCode.SharpZipLib.dll

  3. 压缩的代码

  1. //选择文件夹
  2. private void btnOpen_Click(object sender, EventArgs e)
  3. {
  4. FolderBrowserDialog dialog = new FolderBrowserDialog();//打开文件夹
  5. if (dialog.ShowDialog() != DialogResult.OK)
  6. {
  7. return;
  8. }
  9. txtPath.Text = dialog.SelectedPath;
  10. }
  11. //开始压缩
  12. private void btnZip3_Click(object sender, EventArgs e)
  13. {
  14. ZipOutputStream zipStream = new ZipOutputStream(File.Create(Path.GetFileName(txtPath.Text) + ".zip"));//压缩到Debug中
  15. AddZip3(txtPath.Text, ref zipStream);
  16. zipStream.Finish();
  17. zipStream.Close();
  18. MessageBox.Show("压缩完成");
  19. }
  20. //递归压缩
  21. void AddZip3(string path, ref ZipOutputStream zipStream)
  22. {
  23. //如果是文件,则压缩
  24. if (File.Exists(path))
  25. {
  26. zipStream.SetLevel(); //压缩等级
  27. FileStream f = File.OpenRead(path);
  28. byte[] b = new byte[f.Length];
  29. f.Read(b, , b.Length); //将文件流加入缓冲字节中
  30. string filePath = path.Replace(txtPath.Text, string.Empty).Remove(, );//取相对路径,并且去掉前面的/,否则压缩的文件和文件夹名称前都会加个/
  31. ZipEntry z = new ZipEntry(filePath);//如果是文件夹下的文件,会自动创建文件夹
  32. zipStream.PutNextEntry(z); //为压缩文件流提供一个容器
  33. zipStream.Write(b, , b.Length); //写入字节
  34. f.Close();
  35. }
  36. //如果是文件夹,则循环里面的文件和文件夹
  37. if (Directory.Exists(path))
  38. {
  39. DirectoryInfo di = new DirectoryInfo(path);
  40. foreach (var item in di.GetDirectories())
  41. {
  42. AddZip3(item.FullName, ref zipStream);
  43. }
  44. foreach (var item in di.GetFiles())
  45. {
  46. AddZip3(item.FullName, ref zipStream);
  47. }
  48. }
  49. }

压缩

  4. 解压缩的代码

  1. //选择文件
  2. private void btnOpenFile_Click(object sender, EventArgs e)
  3. {
  4. OpenFileDialog ofd = new OpenFileDialog();
  5. if (ofd.ShowDialog() != DialogResult.OK)
  6. {
  7. return;
  8. }
  9. txtFile.Text = ofd.FileName;
  10. }
  11. private void btnUnZip_Click(object sender, EventArgs e)
  12. {
  13. string path = txtFile.Text;
  14. string un_dir = Path.GetFileNameWithoutExtension(path);//文件的名称
  15. Directory.CreateDirectory(un_dir); //创建以压缩包为名称的文件夹
  16. ZipInputStream f = new ZipInputStream(File.OpenRead(path)); //读取压缩文件,并用此文件流新建 “ZipInputStream”对象
  17. ZipEntry zp; //获取解压文件流中的项目
  18. while ((zp = f.GetNextEntry()) != null)//循环读取每个文件
  19. {
  20. string filePath = Path.Combine(un_dir, zp.Name);
  21. string dirPath = Path.GetDirectoryName(filePath);
  22. if (!zp.IsDirectory && zp.Crc != 00000000L) //此“ZipEntry”不是“标记文件”
  23. {
  24. int i = *;
  25. byte[] b = new byte[i]; //每次缓冲 2048*2 字节
  26. if (!Directory.Exists(dirPath))//存在子文件夹,必须先创建文件夹,否则会报错,无法自动创建文件夹
  27. {
  28. Directory.CreateDirectory(dirPath);
  29. }
  30. FileStream s = File.Create(filePath); //新建文件流
  31. while (true) //持续读取字节,直到一个“ZipEntry”字节读完
  32. {
  33. i = f.Read(b, , b.Length); //读取“ZipEntry”中的字节
  34. if (i > )
  35. {
  36. s.Write(b, , i); //将字节写入新建的文件流
  37. }
  38. else
  39. {
  40. break; //读取的字节为 0 ,跳出循环
  41. }
  42. }
  43. s.Close();
  44. }
  45. }
  46. MessageBox.Show("解压缩OK");
  47. }

解压缩

这个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. python的类与对象

    类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...

  2. AJAX原生JS代码

    var http_request = false;function send_request(method,url,content,responseType,callback){ http_reque ...

  3. php电话号码正则表达式常用例子

    电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) 02   03 ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{ ...

  4. HTML5 CANVAS画图 beginPath和closePath

    beginPath这个canvas函数我很早就讲过了,他的作用很简单,就是开始一段新路径,我们先来看下面的一小段代码: var ctx = document.getElementById('cvs') ...

  5. 写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、

    描述:做了两个页面login.html   index.html  在index的body加了onload事件,调用一个js,js中有cookie的判断,防止没有登录就打开index.html,如果没 ...

  6. 位段(bitfield)

    struct { unsigned int fieldA        :       4 ; unsigned int fieldB        :       2 ; unsigned int ...

  7. 史航第12次作业&总结

    作业1:找出最长的字符串 #include <stdio.h> #include <string.h> int main() { ],strings[][]; ; printf ...

  8. Python—判断变量的基本类型

    type() >>> type(123)==type(456) True >>> type(123)==int True >>> type('ab ...

  9. Could not synchronize database state with session

    今天做一个简单保存时,db2数据库报的错误,网上收集了下问题的解决办法~ 1.主键不是自动生成的,然后自己没手动设置. 2.插入的实体字段跟数据库的关键字冲突. 3.更新的时候,如果更新一个不存在的i ...

  10. hdu 3579 Hello Kiki (中国剩余定理)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...