C#使用SharpZipLib分析

开发 后端
这里介绍C#使用SharpZipLib进行文件的压缩和解压缩,其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享。

学习C#语言时,经常会遇到文件的压缩和解压缩问题,这里将介绍C#使用SharpZipLib进行文件的压缩和解压缩。

C#使用SharpZipLib进行文件的压缩和解压缩

我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为 ZipClass和UnZipClass。其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享,让***接触压缩和解压缩的朋友可以少走些弯路。下面就来解释如何在C#使用SharpZipLib进行文件的压缩和解压缩。

首先需要在项目里引用sharpziplib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:

  1. /// <summary> 
  2. /// 压缩文件  
  3. /// </summary> 
  4.  
  5. using System;  
  6. using System.IO;  
  7.  
  8. using ICSharpCode.SharpZipLib.Checksums;  
  9. using ICSharpCode.SharpZipLib.Zip;  
  10. using ICSharpCode.SharpZipLib.GZip;  
  11.  
  12. namespace Compression  
  13. {  
  14. public class ZipClass  
  15. {  
  16.  
  17. public void ZipFile(string FileToZip, string ZipedFile ,
    int CompressionLevel, int BlockSize)  
  18. {  
  19. //如果文件没有找到,则报错  
  20. if (! System.IO.File.Exists(FileToZip))  
  21. {  
  22. throw new System.IO.FileNotFoundException
    ("The specified file " + FileToZip + " could not be found. Zipping aborderd");  
  23. }  
  24.  
  25. system.io.filestream StreamToZip = new System.IO.FileStream
    (FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);  
  26. System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);  
  27. ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);  
  28. ZipEntry ZipEntry = new ZipEntry("ZippedFile");  
  29. ZipStream.PutNextEntry(ZipEntry);  
  30. ZipStream.SetLevel(CompressionLevel);  
  31. byte[] buffer = new byte[BlockSize];  
  32. System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);  
  33. ZipStream.Write(buffer,0,size);  
  34. try  
  35. {  
  36. while (size < StreamToZip.Length)  
  37. {  
  38. int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);  
  39. ZipStream.Write(buffer,0,sizeRead);  
  40. size += sizeRead;  
  41. }  
  42. }  
  43. catch(System.Exception ex)  
  44. {  
  45. throw ex;  
  46. }  
  47. ZipStream.Finish();  
  48. ZipStream.Close();  
  49. StreamToZip.Close();  
  50. }  
  51.  
  52. public void ZipFileMain(string[] args)  
  53. {  
  54. string[] filenames = Directory.GetFiles(args[0]);  
  55.  
  56. crc32 crc = new Crc32();  
  57. ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));  
  58.  
  59. s.setlevel(6); // 0 - store only to 9 - means best compression  
  60.  
  61. foreach (string file in filenames)  
  62. {  
  63. //打开压缩文件  
  64. FileStream fs = File.OpenRead(file);  
  65.  
  66. byte[] buffer = new byte[fs.Length];  
  67. fs.Read(buffer, 0, buffer.Length);  
  68. ZipEntry entry = new ZipEntry(file);  
  69.  
  70. entry.datetime = DateTime.Now;  
  71.  
  72. // set Size and the crc, because the information  
  73. // about the size and crc should be stored in the header  
  74. // if it is not set it is automatically written in the footer.  
  75. // (in this case size == crc == -1 in the header)  
  76. // Some ZIP programs have problems with zip files that don't store  
  77. // the size and crc in the header.  
  78. entry.Size = fs.Length;  
  79. fs.Close();  
  80.  
  81. crc.reset();  
  82. crc.Update(buffer);  
  83.  
  84. entry.crc = crc.Value;  
  85.  
  86. s.putnextentry(entry);  
  87.  
  88. s.write(buffer, 0, buffer.Length);  
  89.  
  90. }  
  91.  
  92. s.finish();  
  93. s.Close();  
  94. }  
  95. }  
  96. }  
  97.  
  98.   现在再来看看解压文件类的源码  
  99.  
  100. /// <summary> 
  101. /// 解压文件  
  102. /// </summary> 
  103.  
  104. using System;  
  105. using System.Text;  
  106. using System.Collections;  
  107. using System.IO;  
  108. using System.Diagnostics;  
  109. using System.Runtime.Serialization.Formatters.Binary;  
  110. using System.Data;  
  111.  
  112. using ICSharpCode.SharpZipLib.BZip2;  
  113. using ICSharpCode.SharpZipLib.Zip;  
  114. using ICSharpCode.SharpZipLib.Zip.Compression;  
  115. using ICSharpCode.SharpZipLib.Zip.Compression.Streams;  
  116. using ICSharpCode.SharpZipLib.GZip;  
  117.  
  118. namespace DeCompression  
  119. {  
  120. public class UnZipClass  
  121. {  
  122. public void UnZip(string[] args)  
  123. {  
  124. ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));  
  125.  
  126. zipentry theEntry;  
  127. while ((theEntry = s.GetNextEntry()) != null)  
  128. {  
  129.  
  130. string directoryName = Path.GetDirectoryName(args[1]);  
  131. string fileName = Path.GetFileName(theEntry.Name);  
  132.  
  133. //生成解压目录  
  134. Directory.CreateDirectory(directoryName);  
  135.  
  136. if (fileName != String.Empty)  
  137. {  
  138. //解压文件到指定的目录  
  139. FileStream streamWriter = File.Create(args[1]+theEntry.Name);  
  140.  
  141. int size = 2048;  
  142. byte[] data = new byte[2048];  
  143. while (true)  
  144. {  
  145. ssize = s.Read(data, 0, data.Length);  
  146. if (size > 0)  
  147. {  
  148. streamWriter.Write(data, 0, size);  
  149. }  
  150. else  
  151. {  
  152. break;  
  153. }  
  154. }  
  155.  
  156. streamwriter.close();  
  157. }  
  158. }  
  159. s.Close();  
  160. }  
  161. }  
  162. }  

【编辑推荐】

  1. C# System.Xml集合
  2. C#实现Strategy接口
  3. C#编写操作TreeView组件剖析
  4. C#实现IDisposable接口浅析
  5. C#异常处理详细剖析
责任编辑:佚名 来源: cnbeta
相关推荐

2009-08-28 15:52:23

C#利用sharpzi

2009-08-27 15:17:18

C# interfacinterface使用

2009-08-19 11:21:02

C# ListBox控

2009-08-26 16:46:06

C# ThreadSt

2009-08-26 10:34:59

C# Hashtabl

2009-08-27 13:27:50

C# this保留字

2024-03-20 08:55:14

C#文件压缩DotNetZip

2009-09-01 18:36:35

C#委托实例

2009-09-01 18:05:17

C#类型声明

2009-08-21 17:45:40

C#调用COM对象

2009-09-01 10:58:46

C#匿名类型对象

2009-09-18 10:45:31

C#数组操作

2012-10-31 17:37:48

2009-09-01 17:32:04

C#版本控制

2009-08-31 18:24:26

编译C#文件

2009-08-27 18:05:54

C#索引功能

2009-08-27 15:34:38

C#命名空间

2009-08-26 16:26:37

C#迭代器模式

2009-08-27 18:02:22

C#事件处理

2009-08-26 18:00:07

C#内部类
点赞
收藏

51CTO技术栈公众号