• ICSharpCode.SharpZipLib 开源压缩库使用示例


    官方网站:http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx

    插件描述: ICSharpCode.SharpZipLib.dll 是一个完全由c#编写的Zip, GZip, Tar and BZip2 library,可以方便地支持这几种格式的压缩解压缩, SharpZipLib 的许可是经过修改的GPL,底线是允许用在不开源商业软件中,意思就是免费使用。

    一、在ThinksKing的Plugins里面找到已经解压好的SharpZipLib,使用net-20文件夹中的ICSharpCode.SharpZipLib.dll 。添加至项目引用中。

    二、操作指南:

    1.1          创建zip文件,并添加文件:

    using (ZipFile zip = ZipFile.Create(@”E:	est.zip”))
    {
        zip.BeginUpdate();
        zip.Add(@”E:文件1.txt”);
        zip.Add(@”E:文件2.txt”);
        zip.CommitUpdate();
    }

    1.2          将文件夹压缩为文件

    (new FastZip()).CreateZip(@”E:	est.zip”, @”E:	est”, true, “”);

    最后一个参数是使用正则表达式表示的过滤文件规则。CreateZip方法有3个重载版本,其中有目录过滤参数、文件过滤参数及用于指定是否进行子目录递归的一个bool类型的参数。

    1.3          将文件添加到已有zip文件中

    using (ZipFile zip = new ZipFile(@”E:	est.zip”))
    {
        zip.BeginUpdate();
        zip.Add(@”E:	est.doc”);
        zip.CommitUpdate();
    }

    1.4          列出zip文件中文件

    using (ZipFile zip = new ZipFile(@”E:	est.zip”))
    {
        string list = string.Empty;
        foreach (ZipEntry entry in zip)
        {
            list += entry.Name + “
    ”;
        }
        MessageBox.Show(list);
    }        

    1.5          删除zip文件中的一个文件

    using (ZipFile zip = new ZipFile(@”E:	est.zip”))
    {
        zip.BeginUpdate();
        zip.Delete(@”test.doc”);
        zip.Delete(@”test22.txt”);
        zip.CommitUpdate();
    }

    1.6          解压zip文件中文件到指定目录下

    (new FastZip()).ExtractZip(@”E:	est.zip”, @”E:	est”, “”);

    1.7          常用类

      ZipInputStream、GZipInputStream用于解压缩Deflate、GZip格式流,ZipOutputStream、GZipOutputStream用于压缩Deflate、GZip格式流。

      StreamUtil类包含了几个Stream处理辅助方法:

      1) Copy(Stream, Stream, Byte[])用于从一个Stream对象中复制数据到另一Stream对象。有多个重写。

      2) ReadFully(Stream, Byte [])用于从Stream对象中读取所有的byte数据。有多个重写。

    三、帮助文档

      在SharpZipLib中有SharpZipLib_0860.chm官方帮助文档。

    参考链接:在路上的博文:《ICSharpCode.SharpZipLib 插件使用示例


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

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

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

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

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    //using the Compent Comspac
    using System.IO;
    using System.Text;
    using System.Threading;
    using ICSharpCode.SharpZipLib;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Checksums;
    namespace TestJqueryAjax
     {
       /**//// <summary>
       /// 使用ICSharpZipCode.Dll实现解压缩
       /// Author:chenkai  Time:2009年7月13日22:03:27
       /// Version:Beta1.0.0-(测试版)
       /// </summary>
       public class ICSharpZipCodeTest
       {
             /**//// <summary>
           /// 实现压缩功能
           /// </summary>
           /// <param name="filenameToZip">要压缩文件(绝对文件路径)</param>
           /// <param name="Zipedfiledname">压缩(绝对文件路径)</param>
           /// <param name="CompressionLevel">压缩比</param>
           /// <param name="password">加密密码</param>
           /// <param name="comment">压缩文件描述</param>
           /// <returns>异常信息</returns>
           public static string MakeZipFile(string[] filenameToZip, string Zipedfiledname, int CompressionLevel, 
               string password, string comment)
           {
               try
               {
                 //使用正则表达式-判断压缩文件路径
                   System.Text.RegularExpressions.Regex newRegex = new System.Text.
                       RegularExpressions.Regex(@"^(([a-zA-Z]:)|(\{2}w+)$?)(\(w[w   ]*.*))");
                     if (!newRegex.Match(Zipedfiledname).Success)
                   {
                       File.Delete(Zipedfiledname);
                       return "压缩文件的路径有误!";
                   }
                    //创建ZipFileOutPutStream
                   ZipOutputStream newzipstream = new ZipOutputStream(File.Open(Zipedfiledname,
                       FileMode.OpenOrCreate));
                   
                  //判断Password
                   if (password != null && password.Length > 0)
                   {
                       newzipstream.Password = password;
                   }
                     if (comment != null && comment.Length > 0)
                   {
                       newzipstream.SetComment(comment);
                   }
                     //设置CompressionLevel
                   newzipstream.SetLevel(CompressionLevel); //-查看0 - means store only to 9 - means best compression 
                    
                   //执行压缩
                   foreach (string filename in filenameToZip)
                   {
                       FileStream newstream = File.OpenRead(filename);//打开预压缩文件
                         //判断路径
                       if (!newRegex.Match(Zipedfiledname).Success)
                       {
                           File.Delete(Zipedfiledname);
                           return "压缩文件目标路径不存在!";
                       }
                        byte[] setbuffer=new byte[newstream.Length];
                      newstream.Read(setbuffer,0,setbuffer.Length);//读入文件
                        //新建ZipEntrity
                      ZipEntry newEntry = new ZipEntry(filename);
                        //设置时间-长度
                      newEntry.DateTime = DateTime.Now;
                      newEntry.Size = newstream.Length;
                        newstream.Close();
                        newzipstream.PutNextEntry(newEntry);//压入
                       newzipstream.Write(setbuffer,0,setbuffer.Length);
                       
                   }
                   //重复压入操作
                   newzipstream.Finish();
                   newzipstream.Close();
                     
               }catch (Exception e)
               {
                 //出现异常
                   File.Delete(Zipedfiledname);
                   return e.Message.ToString();
               }
               
               return "";
           }
           /**//// <summary>
           /// 实现解压操作
           /// </summary>
           /// <param name="zipfilename">要解压文件Zip(物理路径)</param>
           /// <param name="UnZipDir">解压目的路径(物理路径)</param>
           /// <param name="password">解压密码</param>
           /// <returns>异常信息</returns>
           public static string UnMakeZipFile(string zipfilename,string UnZipDir,string password)
           {
               //判断待解压文件路径
               if (!File.Exists(zipfilename))
               {
                   File.Delete(UnZipDir);
                   return "待解压文件路径不存在!";
               }
               
               //创建ZipInputStream
               ZipInputStream newinStream = new ZipInputStream(File.OpenRead(zipfilename));
               
               //判断Password
               if (password != null && password.Length > 0)
               {
                   newinStream.Password = password;
               }
                //执行解压操作
               try
               {
                   ZipEntry theEntry;
                    //获取Zip中单个File
                   while ((theEntry = newinStream.GetNextEntry()) != null)
                   {
                       //判断目的路径
                       if (Directory.Exists(UnZipDir))
                       {
                           Directory.CreateDirectory(UnZipDir);//创建目的目录
                       }
                        //获得目的目录信息
                       string Driectoryname = Path.GetDirectoryName(UnZipDir);
                       string pathname = Path.GetDirectoryName(theEntry.Name);//获得子级目录
                       string filename = Path.GetFileName(theEntry.Name);//获得子集文件名
                        //处理文件盘符问题
                       pathname = pathname.Replace(":", "$");//处理当前压缩出现盘符问题
                       Driectoryname = Driectoryname + "\" + pathname;
                        //创建
                       Directory.CreateDirectory(Driectoryname);
                        //解压指定子目录
                       if (filename != string.Empty)
                       {
                           FileStream newstream = File.Create(Driectoryname + "\" + pathname);
                           int size = 2048;
                           byte[] newbyte = new byte[size];
                           while (true)
                           {
                               size = newinStream.Read(newbyte, 0, newbyte.Length);
                                if (size > 0)
                               {
                                   //写入数据
                                   newstream.Write(newbyte, 0, size);
                               }
                               else
                               {
                                   break;
                               }
                               newstream.Close();
                           }
                       }
                    }
                   newinStream.Close();
               }
               catch (Exception se)
               {
                    return se.Message.ToString();
               }
               finally
               {
                   newinStream.Close();
               }
    
               return "";
           }
       }
    }

    参考链接:陈凯的博文:《使用ICSharpCode.SharpZipLib-(C#)实现解压缩文件的操作类

  • 相关阅读:
    .NET CORE QuartzJob定时任务+Windows/Linux部署
    .NET CORE 数据保护
    Docker容器间通信
    Docker加载本地证书
    转载-AppDomain详解
    JMeter尝鲜
    从String类型发散想到的一些东西
    npm源管理
    一张脑图整理Docker常用命令
    构造管“生”对象?析构管“埋”对象?C++中构造析构还没整明白?
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/4559691.html
Copyright © 2020-2023  润新知