使用ICSharpCode.SharpZipLib-(C#)实现解压缩文件的操作类

简介:

在处理后台附件上载由于文件较多,需要每个文件单独上传关键是有些文件数据量比较少 也需要单独上传,这样导致后台数据流量较大而且用户操作麻烦.

在处理这方面业务时,可以简化:首先验证用户上传文件的大小,设定不超过1M文件为限制并记录,当用户点击一次操作时后台程序把所有小数据量文件进行压缩成一个单独文件来上传,这样简化用户操作难度 增强用户体验,在获得上载文件时同样把这个文件进行解压本地即可...

使用ICSharpCode.SharpZipLib-(C#)实现解压缩文件的操作类: 完整代码如下
A:ICSharpCode.SharpZipLib.DLL组件下载地址,如果要实现必须在项目中引用该组件DLL
下载地址:http://good.gd/203866.htm

B:完整的操作类代码实例:

 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.  
  6. //using the Compent Comspac  
  7. using System.IO;  
  8. using System.Text;  
  9. using System.Threading;  
  10. using ICSharpCode.SharpZipLib;  
  11. using ICSharpCode.SharpZipLib.Zip;  
  12. using ICSharpCode.SharpZipLib.Checksums;  
  13.  
  14. namespace TestJqueryAjax  
  15. {  
  16.     /**//// <summary>  
  17.     /// 使用ICSharpZipCode.Dll实现解压缩  
  18.     /// Author:chenkai  Time:2009年7月13日22:03:27  
  19.     /// Version:Beta1.0.0-(测试版)  
  20.     /// </summary>  
  21.     public class ICSharpZipCodeTest  
  22.     {  
  23.  
  24.         /**//// <summary>  
  25.         /// 实现压缩功能  
  26.         /// </summary>  
  27.         /// <param name="filenameToZip">要压缩文件(绝对文件路径)</param>  
  28.         /// <param name="Zipedfiledname">压缩(绝对文件路径)</param>  
  29.         /// <param name="CompressionLevel">压缩比</param>  
  30.         /// <param name="password">加密密码</param>  
  31.         /// <param name="comment">压缩文件描述</param>  
  32.         /// <returns>异常信息</returns>  
  33.         public static string MakeZipFile(string[] filenameToZip, string Zipedfiledname, int CompressionLevel,   
  34.             string password, string comment)  
  35.         {  
  36.             try  
  37.             {  
  38.               //使用正则表达式-判断压缩文件路径  
  39.                 System.Text.RegularExpressions.Regex newRegex = new System.Text.  
  40.                     RegularExpressions.Regex(@"^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w   ]*.*))");  
  41.  
  42.                 if (!newRegex.Match(Zipedfiledname).Success)  
  43.                 {  
  44.                     File.Delete(Zipedfiledname);  
  45.                     return "压缩文件的路径有误!";  
  46.                 }  
  47.  
  48.                //创建ZipFileOutPutStream  
  49.                 ZipOutputStream newzipstream = new ZipOutputStream(File.Open(Zipedfiledname,  
  50.                     FileMode.OpenOrCreate));  
  51.                   
  52.                //判断Password 
  53.                 if (password != null && password.Length > 0)  
  54.                 {  
  55.                     newzipstream.Password = password;  
  56.                 }  
  57.  
  58.                 if (comment != null && comment.Length > 0)  
  59.                 {  
  60.                     newzipstream.SetComment(comment);  
  61.                 }  
  62.  
  63.                 //设置CompressionLevel  
  64.                 newzipstream.SetLevel(CompressionLevel); //-查看0 - means store only to 9 - means best compression   
  65.                    
  66.                 //执行压缩  
  67.                 foreach (string filename in filenameToZip)  
  68.                 {  
  69.                     FileStream newstream = File.OpenRead(filename);//打开预压缩文件  
  70.  
  71.                     //判断路径  
  72.                     if (!newRegex.Match(Zipedfiledname).Success)  
  73.                     {  
  74.                         File.Delete(Zipedfiledname);  
  75.                         return "压缩文件目标路径不存在!";  
  76.                     }  
  77.  
  78.                    byte[] setbuffer=new byte[newstream.Length];  
  79.                    newstream.Read(setbuffer,0,setbuffer.Length);//读入文件  
  80.  
  81.                    //新建ZipEntrity  
  82.                    ZipEntry newEntry = new ZipEntry(filename);  
  83.  
  84.                    //设置时间-长度  
  85.                    newEntry.DateTime = DateTime.Now;  
  86.                    newEntry.Size = newstream.Length;  
  87.  
  88.                    newstream.Close();  
  89.  
  90.                    newzipstream.PutNextEntry(newEntry);//压入  
  91.  
  92.                    newzipstream.Write(setbuffer,0,setbuffer.Length);  
  93.                       
  94.                 }  
  95.                 //重复压入操作  
  96.                 newzipstream.Finish();  
  97.                 newzipstream.Close();  
  98.                     
  99.             }catch (Exception e)  
  100.             {  
  101.               //出现异常  
  102.                 File.Delete(Zipedfiledname);  
  103.                 return e.Message.ToString();  
  104.             }  
  105.               
  106.             return "";  
  107.         }  
  108.  
  109.         /**//// <summary>  
  110.         /// 实现解压操作  
  111.         /// </summary>  
  112.         /// <param name="zipfilename">要解压文件Zip(物理路径)</param>  
  113.         /// <param name="UnZipDir">解压目的路径(物理路径)</param>  
  114.        /// <param name="password">解压密码</param>  
  115.         /// <returns>异常信息</returns>  
  116.         public static string UnMakeZipFile(string zipfilename,string UnZipDir,string password)  
  117.         {  
  118.             //判断待解压文件路径  
  119.             if (!File.Exists(zipfilename))  
  120.             {  
  121.                 File.Delete(UnZipDir);  
  122.                 return "待解压文件路径不存在!";  
  123.             }  
  124.               
  125.             //创建ZipInputStream  
  126.             ZipInputStream newinStream = new ZipInputStream(File.OpenRead(zipfilename));  
  127.               
  128.             //判断Password 
  129.             if (password != null && password.Length > 0)  
  130.             {  
  131.                 newinStream.Password = password;  
  132.             }  
  133.  
  134.             //执行解压操作  
  135.             try  
  136.             {  
  137.                 ZipEntry theEntry;  
  138.  
  139.                 //获取Zip中单个File  
  140.                 while ((theEntry = newinStream.GetNextEntry()) != null)  
  141.                 {  
  142.                     //判断目的路径  
  143.                     if (Directory.Exists(UnZipDir))  
  144.                     {  
  145.                         Directory.CreateDirectory(UnZipDir);//创建目的目录  
  146.                     }  
  147.  
  148.                     //获得目的目录信息  
  149.                     string Driectoryname = Path.GetDirectoryName(UnZipDir);  
  150.                     string pathname = Path.GetDirectoryName(theEntry.Name);//获得子级目录  
  151.                     string filename = Path.GetFileName(theEntry.Name);//获得子集文件名  
  152.  
  153.                     //处理文件盘符问题  
  154.                     pathname = pathname.Replace(":""$");//处理当前压缩出现盘符问题  
  155.                     Driectoryname = Driectoryname + "\\" + pathname;  
  156.  
  157.                     //创建  
  158.                     Directory.CreateDirectory(Driectoryname);  
  159.  
  160.                     //解压指定子目录  
  161.                     if (filename != string.Empty)  
  162.                     {  
  163.                         FileStream newstream = File.Create(Driectoryname + "\\" + pathname);  
  164.  
  165.                         int size = 2048;  
  166.  
  167.                         byte[] newbyte = new byte[size];  
  168.  
  169.                         while (true)  
  170.                         {  
  171.                             size = newinStream.Read(newbyte, 0, newbyte.Length);  
  172.  
  173.                             if (size > 0)  
  174.                             {  
  175.                                 //写入数据  
  176.                                 newstream.Write(newbyte, 0, size);  
  177.                             }  
  178.                             else 
  179.                             {  
  180.                                 break;  
  181.                             }  
  182.                             newstream.Close();  
  183.                         }  
  184.                     }  
  185.  
  186.                 }  
  187.                 newinStream.Close();  
  188.             }  
  189.             catch (Exception se)  
  190.             {  
  191.  
  192.                 return se.Message.ToString();  
  193.             }  
  194.             finally  
  195.             {  
  196.                 newinStream.Close();  
  197.             }  
  198.  
  199.  
  200.             return "";  
  201.         }  
  202.     }  

 


本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/765387


相关文章
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
2月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
76 2
|
1月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
32 1
|
1月前
|
存储 C#
C#使用哈夫曼编码实现压缩与解压
C#使用哈夫曼编码实现压缩与解压
23 0
|
1月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
11 0
|
1月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
75 0
|
2月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
25 2
|
3月前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
33 0
|
3月前
|
开发框架 .NET 编译器
C# 中的记录(record)类型和类(class)类型对比总结
C# 中的记录(record)类型和类(class)类型对比总结
|
3月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件