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);
  }

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 升级Mac Catalina后OBS录屏软件麦克风和内置声音输出没有声音的问题[通俗易懂]

    升级Mac Catalina后OBS录屏软件麦克风和内置声音输出没有声音的问题[通俗易懂]升级MacCatalina后,OBS录屏软件录制的视频,电脑内置声音输出,以及麦克风输入声音都没有。使用网上搜到的soundflower工具也不行。后来找到如下命令临时解决。在终端输入如下命令:open/Applications/OBS.app/Contents/MacOS/OBS–args-picture每次使用OBS,都需要用上述方法。直接打开OBS的不行,需要等OBS…

  • c++中如何定义常量_电脑基础知识教程自学

    c++中如何定义常量_电脑基础知识教程自学想学习c++的朋友可以来关注一下a,从入门的知识开始。

    2022年10月29日
  • Android最全UI库合集

    Android最全UI库合集AndroidUILibrary目录索引抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新ViewPager图表(Chart)菜单(Menu)浮动菜单对话框空白页滑动删除手势操作RecyclerViewCard…

  • Drupal8的详细建站教程

    Drupal8的详细建站教程什么是drupal?    drupal是一个好用且功能强大的内容管理系统(CMS),通常也被称为是内容管理框架(CMF),由来自全世界各地的开发人员共同开发和维护,目前最新版本是Drupal8。安装drupal所需基础    建站环境:Windows或Linux操作系统   Web服务器:Apache,Nginx,Lighttpd,或微软的IIS服务器,

  • VS2013注册码_vs注册密钥

    VS2013注册码_vs注册密钥vs2012注册码YKCW6-BPFPF-BT8C9-7DCTH-QXGWCRBCXF-CVBGR-382MK-DFHJ4-C69G8MMVJ9-FKY74-W449Y-RB79G-8GJGJ4D974-9QX42-9Y43G-YJ7JG-JDYBPYCFHQ-9DWCY-DKV88-T2TMH-G7BHP亲测有效!

  • Java学习之多线程篇

    0x00前言在一个工具开发中,如果该工具需要不断的去执行同一个动作或者是请求的话,使用单线程是非常慢。还是拿一个目录扫描器来举例子,比如我们需要开发一个目录扫描器,我们的字典里有10000个字典,

    2021年12月12日

发表回复

您的电子邮箱地址不会被公开。

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