使用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月前
|
XML C# 数据格式
使用C#操作XML文件
使用C#操作XML文件
11 0
|
1月前
|
C#
C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录
C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录
23 0
|
1月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
1月前
|
C#
58.c#:directory类
58.c#:directory类
12 0
|
1月前
|
C#
57.c#:directorylnfo类
57.c#:directorylnfo类
13 0
|
1月前
|
监控 C#
55.c#:file类
55.c#:file类
16 1
|
1月前
|
算法 C#
54.c#:random类
54.c#:random类
14 1
|
1月前
|
C#
51.c#:string类的静态方法
51.c#:string类的静态方法
20 1
|
6天前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
15 1
|
1月前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收