热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#ICSharpCode.SharpZipLib压缩、解压文件附源码

http:www.icsharpcode.netopensourcesharpziplib有SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip,GZ

http://www.icsharpcode.net/opensource/sharpziplib/ 有SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, GZip, BZip2 和Tar格式。我们需要dll 在官网上也有。

好了,深入的大家还要多多研究,今天我们简单介绍一下 简单的 单文件、文件夹的压缩和解压

 

先给大家看一下效果:

 

 

一、引入ICSharpCode.SharpZipLib

我们新建个帮助类 ZipHelper.cs  然后 添加 dll 引用 

 

 

二、添加完dll引用之后 我们 需要添加 这几个Using引用
 
  1. 1 using ICSharpCode.SharpZipLib.Checksums;

  2. 2 using ICSharpCode.SharpZipLib.Zip;

  3. 3 using System;4 using System.IO;

 

 

 

三、压缩单个文件

这里我添加了几个参数 大家可以根据自己的需要 修改一下 

 
  1. 1 ///

  2. 2 /// ZIP:压缩单个文件

  3. 3 /// add yuangang by 2016-06-13

  4. 4 ///

  5. 5 /// 需要压缩的文件(绝对路径)

  6. 6 /// 压缩后的文件路径(绝对路径)

  7. 7 /// 压缩后的文件名称(文件名,默认 同源文件同名)

  8. 8 /// 压缩等级(0 无 - 9 最高,默认 5)

  9. 9 /// 缓存大小(每次写入文件大小,默认 2048)

  10. 10 /// 是否加密(默认 加密)

  11. 11 public static void ZipFile(string FileToZip, string ZipedPath, string ZipedFileName = "", int CompressiOnLevel= 5, int BlockSize = 2048, bool IsEncrypt = true)

  12. 12 {

  13. 13 //如果文件没有找到,则报错

  14. 14 if (!System.IO.File.Exists(FileToZip))

  15. 15 {

  16. 16 throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");

  17. 17 }

  18. 18

  19. 19 //文件名称(默认同源文件名称相同)

  20. 20 string ZipFileName = string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\" + new FileInfo(FileToZip).Name.Substring(0, new FileInfo(FileToZip).Name.LastIndexOf(".")) + ".zip" : ZipedPath + "\" + ZipedFileName + ".zip";

  21. 21

  22. 22 using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipFileName))

  23. 23 {

  24. 24 using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))

  25. 25 {

  26. 26 using (System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read))

  27. 27 {

  28. 28 string fileName = FileToZip.Substring(FileToZip.LastIndexOf("\") + 1);

  29. 29

  30. 30 ZipEntry ZipEntry = new ZipEntry(fileName);

  31. 31

  32. 32 if (IsEncrypt)

  33. 33 {

  34. 34 //压缩文件加密

  35. 35 ZipStream.Password = “123”;

  36. 36 }

  37. 37

  38. 38 ZipStream.PutNextEntry(ZipEntry);

  39. 39

  40. 40 //设置压缩级别

  41. 41 ZipStream.SetLevel(CompressionLevel);

  42. 42

  43. 43 //缓存大小

  44. 44 byte[] buffer = new byte[BlockSize];

  45. 45

  46. 46 int sizeRead = 0;

  47. 47

  48. 48 try

  49. 49 {

  50. 50 do

  51. 51 {

  52. 52 sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);

  53. 53 ZipStream.Write(buffer, 0, sizeRead);

  54. 54 }

  55. 55 while (sizeRead > 0);

  56. 56 }

  57. 57 catch (System.Exception ex)

  58. 58 {

  59. 59 throw ex;

  60. 60 }

  61. 61

  62. 62 StreamToZip.Close();

  63. 63 }

  64. 64

  65. 65 ZipStream.Finish();

  66. 66 ZipStream.Close();

  67. 67 }

  68. 68

  69. 69 ZipFile.Close();

  70. 70 }

  71. 71 }

 

 

 

四、压缩文件夹
 
  1. 1 ///

  2. 2 /// ZIP:压缩文件夹

  3. 3 /// add yuangang by 2016-06-13

  4. 4 ///

  5. 5 /// 需要压缩的文件夹(绝对路径)

  6. 6 /// 压缩后的文件路径(绝对路径)

  7. 7 /// 压缩后的文件名称(文件名,默认 同源文件夹同名)

  8. 8 /// 是否加密(默认 加密)

  9. 9 public static void ZipDirectory(string DirectoryToZip, string ZipedPath, string ZipedFileName = "", bool IsEncrypt = true)

  10. 10 {

  11. 11 //如果目录不存在,则报错

  12. 12 if (!System.IO.Directory.Exists(DirectoryToZip))

  13. 13 {

  14. 14 throw new System.IO.FileNotFoundException("指定的目录: " + DirectoryToZip + " 不存在!");

  15. 15 }

  16. 16

  17. 17 //文件名称(默认同源文件名称相同)

  18. 18 string ZipFileName = string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\" + new DirectoryInfo(DirectoryToZip).Name + ".zip" : ZipedPath + "\" + ZipedFileName + ".zip";

  19. 19

  20. 20 using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipFileName))

  21. 21 {

  22. 22 using (ZipOutputStream s = new ZipOutputStream(ZipFile))

  23. 23 {

  24. 24 if (IsEncrypt)

  25. 25 {

  26. 26 //压缩文件加密

  27. 27 s.Password = “123”;

  28. 28 }

  29. 29 ZipSetp(DirectoryToZip, s, "");

  30. 30 }

  31. 31 }

  32. 32 }

  33. 33 ///

  34. 34 /// 递归遍历目录

  35. 35 /// add yuangang by 2016-06-13

  36. 36 ///

  37. 37 private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath)

  38. 38 {

  39. 39 if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)

  40. 40 {

  41. 41 strDirectory += Path.DirectorySeparatorChar;

  42. 42 }

  43. 43 Crc32 crc = new Crc32();

  44. 44

  45. 45 string[] filenames = Directory.GetFileSystemEntries(strDirectory);

  46. 46

  47. 47 foreach (string file in filenames)// 遍历所有的文件和目录

  48. 48 {

  49. 49

  50. 50 if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件

  51. 51 {

  52. 52 string pPath = parentPath;

  53. 53 pPath += file.Substring(file.LastIndexOf("\") + 1);

  54. 54 pPath += "\";

  55. 55 ZipSetp(file, s, pPath);

  56. 56 }

  57. 57

  58. 58 else // 否则直接压缩文件

  59. 59 {

  60. 60 //打开压缩文件

  61. 61 using (FileStream fs = File.OpenRead(file))

  62. 62 {

  63. 63

  64. 64 byte[] buffer = new byte[fs.Length];

  65. 65 fs.Read(buffer, 0, buffer.Length);

  66. 66

  67. 67 string fileName = parentPath + file.Substring(file.LastIndexOf("\") + 1);

  68. 68 ZipEntry entry = new ZipEntry(fileName);

  69. 69

  70. 70 entry.DateTime = DateTime.Now;

  71. 71 entry.Size = fs.Length;

  72. 72

  73. 73 fs.Close();

  74. 74

  75. 75 crc.Reset();

  76. 76 crc.Update(buffer);

  77. 77

  78. 78 entry.Crc = crc.Value;

  79. 79 s.PutNextEntry(entry);

  80. 80

  81. 81 s.Write(buffer, 0, buffer.Length);

  82. 82 }

  83. 83 }

  84. 84 }

  85. 85 }

 

 

 

五、解压一个ZIP文件
 
  1. 1 ///

  2. 2 /// ZIP:解压一个zip文件

  3. 3 /// add yuangang by 2016-06-13

  4. 4 ///

  5. 5 /// 需要解压的Zip文件(绝对路径)

  6. 6 /// 解压到的目录

  7. 7 /// 解压密码

  8. 8 /// 是否覆盖已存在的文件

  9. 9 public static void UnZip(string ZipFile, string TargetDirectory, string Password, bool OverWrite = true)

  10. 10 {

  11. 11 //如果解压到的目录不存在,则报错

  12. 12 if (!System.IO.Directory.Exists(TargetDirectory))

  13. 13 {

  14. 14 throw new System.IO.FileNotFoundException("指定的目录: " + TargetDirectory + " 不存在!");

  15. 15 }

  16. 16 //目录结尾

  17. 17 if (!TargetDirectory.EndsWith("\")) { TargetDirectory = TargetDirectory + "\"; }

  18. 18

  19. 19 using (ZipInputStream zipfiles = new ZipInputStream(File.OpenRead(ZipFile)))

  20. 20 {

  21. 21 zipfiles.Password = Password;

  22. 22 ZipEntry theEntry;

  23. 23

  24. 24 while ((theEntry = zipfiles.GetNextEntry()) != null)

  25. 25 {

  26. 26 string directoryName = "";

  27. 27 string pathToZip = "";

  28. 28 pathToZip = theEntry.Name;

  29. 29

  30. 30 if (pathToZip != "")

  31. 31 directoryName = Path.GetDirectoryName(pathToZip) + "\";

  32. 32

  33. 33 string fileName = Path.GetFileName(pathToZip);

  34. 34

  35. 35 Directory.CreateDirectory(TargetDirectory + directoryName);

  36. 36

  37. 37 if (fileName != "")

  38. 38 {

  39. 39 if ((File.Exists(TargetDirectory + directoryName + fileName) && OverWrite) || (!File.Exists(TargetDirectory + directoryName + fileName)))

  40. 40 {

  41. 41 using (FileStream streamWriter = File.Create(TargetDirectory + directoryName + fileName))

  42. 42 {

  43. 43 int size = 2048;

  44. 44 byte[] data = new byte[2048];

  45. 45 while (true)

  46. 46 {

  47. 47 size = zipfiles.Read(data, 0, data.Length);

  48. 48

  49. 49 if (size > 0)

  50. 50 streamWriter.Write(data, 0, size);

  51. 51 else

  52. 52 break;

  53. 53 }

  54. 54 streamWriter.Close();

  55. 55 }

  56. 56 }

  57. 57 }

  58. 58 }

  59. 59

  60. 60 zipfiles.Close();

  61. 61 }

  62. 62 }

 

 

 

转载至 http://www.cnblogs.com/yuangang/p/5581391.html

非原创文章, 转载请尊重作者劳动成果 http://yuangang.cnblogs.com


推荐阅读
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本文详细介绍了在C#编程环境中绘制正方形图像的技术和实现方法,通过具体示例代码帮助读者理解和掌握相关技巧。内容涵盖从基础概念到实际应用的各个方面,适合初学者和有一定经验的开发者参考。希望对您的C#学习之旅有所帮助,并激发您进一步探索的兴趣。 ... [详细]
  • 本文探讨了如何在 Java 中将多参数方法通过 Lambda 表达式传递给一个接受 List 的 Function。具体分析了 `OrderUtil` 类中的 `runInBatches` 方法及其使用场景。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
author-avatar
手机用户2602897795
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有