C#使用#ziplib压缩和解压缩文件

C#使用#ziplib压缩和解压缩文件要下载整个目录,一般方法是一个个文件下载或ftp工具现在用SharpZipLib就能实现实时zip压缩下载整个目录SharpZipLib提供了多种压缩算法的支持,纯csharp代码,参见http://www.icsharpcode.net/OpenSource/SharpZipLib/default.asp原理是通过递归方法将每个文件压缩到ZipOutputStream,然

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

要下载整个目录,一般方法是一个个文件下载或ftp工具
现在用SharpZipLib就能实现实时zip压缩下载整个目录

SharpZipLib提供了多种压缩算法的支持,纯csharp代码,参见
http://www.icsharpcode.net/OpenSource/SharpZipLib/default.asp

原理是通过递归方法将每个文件压缩到ZipOutputStream,然后下载

代码和范例如下:

< %@ Import namespace=”ICSharpCode.SharpZipLib.Zip” %>
< %@ Import Namespace=”System.IO” %>
< script language=”c#” runat=”server”>
ZipOutputStream zos=null;
String strBaseDir=””;
void dlZipDir(string strPath,string strFileName){

  MemoryStream ms =null;
  Response.ContentType = “application/octet-stream”;
  strFileName=HttpUtility.UrlEncode(strFileName).Replace(‘+’,’ ‘);
  Response.AddHeader(“Content-Disposition”, “attachment; filename=” + strFileName+”.zip”);
  ms = new MemoryStream();
  zos = new ZipOutputStream(ms);
  strBaseDir=strPath+”\\”;
  addZipEntry(strBaseDir);
  zos.Finish();
  zos.Close();
  Response.Clear();
  Response.BinaryWrite(ms.ToArray());
  Response.End();
}

void addZipEntry(string PathStr){

  DirectoryInfo di= new DirectoryInfo(PathStr);
  foreach(DirectoryInfo item in di.GetDirectories()){

   addZipEntry(item.FullName);
  }
  foreach(FileInfo item in di.GetFiles()){

   FileStream fs = File.OpenRead(item.FullName);
   byte[] buffer = new byte[fs.Length];
   fs.Read(buffer, 0, buffer.Length);
   string strEntryName=item.FullName.Replace(strBaseDir,””);
   ZipEntry entry = new ZipEntry(strEntryName);
   zos.PutNextEntry(entry);
   zos.Write(buffer, 0, buffer.Length);
   fs.Close();
  }
}
void Page_Load(){

  dlZipDir(Server.MapPath(“.”),”test”);
}
< /script>

 

 

 

转贴:给楼主参考.我自己根据这篇文章写了一个通过调用浏览对话框选定一个文件夹打包压缩的程序,楼主需要的话mail我吧.lvmeng@163.com.
以下为转贴内容:
我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net/下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为ZipClass和UnZipClass。其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享,让首次接触压缩和解压缩的朋友可以少走些弯路。下面就来解释如何在C#里用http://www.icsharpcode.net/下载的SharpZipLib进行文件的压缩和解压缩。

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

/// <summary>
/// 压缩文件
/// </summary>

using System;
using System.IO;

using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;

namespace Compression
{

public class ZipClass
{

  public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize)
  {

   //如果文件没有找到,则报错
   if (! System.IO.File.Exists(FileToZip))
   {

    throw new System.IO.FileNotFoundException(“The specified file ” + FileToZip + ” could not be found. Zipping aborderd”);
   }
 
   System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
   System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
   ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
   ZipEntry ZipEntry = new ZipEntry(“ZippedFile”);
   ZipStream.PutNextEntry(ZipEntry);
   ZipStream.SetLevel(CompressionLevel);
   byte[] buffer = new byte[BlockSize];
   System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
   ZipStream.Write(buffer,0,size);
   try
   {

    while (size < StreamToZip.Length)
    {

     int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
     ZipStream.Write(buffer,0,sizeRead);
     size += sizeRead;
    }
   }
   catch(System.Exception ex)
   {

    throw ex;
   }
   ZipStream.Finish();
   ZipStream.Close();
   StreamToZip.Close();
  }

  public void ZipFileMain(string[] args)
  {

   string[] filenames = Directory.GetFiles(args[0]);
 
   Crc32 crc = new Crc32();
   ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));
 
   s.SetLevel(6); // 0 – store only to 9 – means best compression
 
   foreach (string file in filenames)
   {

    //打开压缩文件
    FileStream fs = File.OpenRead(file);
  
    byte[] buffer = new byte[fs.Length];
    fs.Read(buffer, 0, buffer.Length);
    ZipEntry entry = new ZipEntry(file);
  
    entry.DateTime = DateTime.Now;
  
    // set Size and the crc, because the information
    // about the size and crc should be stored in the header
    // if it is not set it is automatically written in the footer.
    // (in this case size == crc == -1 in the header)
    // Some ZIP programs have problems with zip files that don’t store
    // the size and crc in the header.
    entry.Size = fs.Length;
    fs.Close();
  
    crc.Reset();
    crc.Update(buffer);
  
    entry.Crc  = crc.Value;
  
    s.PutNextEntry(entry);
  
    s.Write(buffer, 0, buffer.Length);
  
   }
 
   s.Finish();
   s.Close();
  }
}
}

现在再来看看解压文件类的源码

/// <summary>
/// 解压文件
/// </summary>

using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;

using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;

namespace DeCompression
{

public class UnZipClass
{  
  public void UnZip(string[] args)
  {

   ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
 
   ZipEntry theEntry;
   while ((theEntry = s.GetNextEntry()) != null)
   {

  
          string directoryName = Path.GetDirectoryName(args[1]);
    string fileName      = Path.GetFileName(theEntry.Name);
  
    //生成解压目录
    Directory.CreateDirectory(directoryName);
  
    if (fileName != String.Empty)
    {  
     //解压文件到指定的目录
     FileStream streamWriter = File.Create(args[1]+theEntry.Name);
   
     int size = 2048;
     byte[] data = new byte[2048];
     while (true)
     {

      size = s.Read(data, 0, data.Length);
      if (size > 0)
      {

       streamWriter.Write(data, 0, size);
      }
      else
      {

       break;
      }
     }
   
     streamWriter.Close();
    }
   }
   s.Close();
  }
}
}

    有了压缩和解压缩的类以后,就要在窗体里调用了。怎么?是新手,不会调用?Ok,接着往下看如何在窗体里调用。

    首先在窗体里放置两个命令按钮(不要告诉我你不会放啊~),然后编写以下源码

/// <summary>
/// 调用源码
/// </summary>

      private void button2_Click_1(object sender, System.EventArgs e)
  {

   string []FileProperties=new string[2];
   FileProperties[0]=”C:\unzipped\”;//待压缩文件目录
   FileProperties[1]=”C:\zip\a.zip”;  //压缩后的目标文件
   ZipClass Zc=new ZipClass();
   Zc.ZipFileMain(FileProperties);
  }

     private void button2_Click(object sender, System.EventArgs e)
  {

   string []FileProperties=new string[2];
   FileProperties[0]=”C:\zip\test.zip”;//待解压的文件
   FileProperties[1]=”C:\unzipped\”;//解压后放置的目标目录
   UnZipClass UnZc=new UnZipClass();
   UnZc.UnZip(FileProperties);
  }

    好了,到此为止,如何压缩和解压缩的类都已经完成了,需要的朋友直接拿走调吧。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159440.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [职场]最近聊到30岁以上的程序员,该何去何从了?你有啥想法?

    [职场]最近聊到30岁以上的程序员,该何去何从了?你有啥想法?

    2022年2月19日
    44
  • 指针函数和函数指针「建议收藏」

    指针函数和函数指针「建议收藏」概述指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。指针函数指针函数:顾名思义,它的本质是一个函数…

    2022年6月22日
    30
  • MacPorts 安装与使用

    MacPorts 安装与使用MacPorts安装与使用安装修改安装源MacPorts使用MacPorts像brew一样,可以快速安装软件。安装在安装macports之前注意要保证当前系统已安装xcode且保持最新版本。https://www.macports.org/install.php官网地址查找对应的系统版本。找到对应版本的dmg安装包,下载后安装。在安装的过程中,会卡在运行软件包步骤。切记断网安装,不进行软件包的安装更新。如果卡在此安装步骤无法退出,可进行如下操作:1.在活动监视器找到对应的安装程序强制退

    2022年9月21日
    2
  • 静态路由的基本配置实验总结_三个路由器配置静态路由

    静态路由的基本配置实验总结_三个路由器配置静态路由静态路由的基本配置静态路由配置图如下PC1IP地址:192.168.1.2PC2IP地址:192.168.2.2PC3IP地址:192.168.3.2PC4IP地址:192.168.4.2R1IP地址:f1/0192.168.3.1f0/2192.168.4.1s2/01.1.1.1R2IP地址:f0/0192.168.1.1f1/0192.168.2.1s2/01.1.1.2配置好四台电脑

    2022年9月24日
    3
  • navicat11.0.18激活码【2021免费激活】

    (navicat11.0.18激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

    2022年3月27日
    389
  • 公共开放WebService接口

    公共开放WebService接口公共开放WebService接口快递查询WEB服务 http://webservice.36wu.com/ExpressService.asmx支持上百家快递/物流查询,准确高效,所有数据均来自快递服务商。此数据返回类型进行了封装,方便开发人员和应用者进行调用,后期会提供返回json类型,敬请关注。支持的快递/物流天气预报WEB服务 ht

    2022年7月16日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号