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)


相关推荐

  • Ubuntu 下 通过ADB 安装Apk和导出手机中的Apk

    Ubuntu 下 通过ADB 安装Apk和导出手机中的Apk一、连接电脑首先确保你的手机打开了调试模式然后输入命令adbdevicesroot@lvi166-CN15S:/home/lvi166#adbdevicesListofdevicesattachedce10171a39a990c00b7e device如果连接成功则会出现你的设备二、确认你要导出的apk包名root@lvi166-CN15S:/hom…

  • C语言刷屏

    C语言刷屏QQ刷屏原理和复制粘贴差不多,只不过是叫系统帮你粘贴并摁下回车键。#include<stdio.h>#include<Windows.h>intmain(){ intn; charname[100]; printf(“请输入窗口名字:”); scanf(“%s”,&name);//窗口名字 printf(“请输入刷屏次数:”);…

  • docker 查看端口被占用进程[通俗易懂]

    docker 查看端口被占用进程[通俗易懂]以下找到相应进程或容器后,可以将对于进程或容器停止或删除现在希望启动一个dockercontainer,把container中的80端口映射到宿主机。[root@cmdb2~]#dockerrun-p80:80-it9d1c954badc7/bin/bash[root@cmdb2~]#dockerpsCONTAINERIDIM…

  • php 0xffffffff,0xffffffff – 依睛(IT blog) 我回来了,PHPC/C++ LINUX – IT博客「建议收藏」

    php 0xffffffff,0xffffffff – 依睛(IT blog) 我回来了,PHPC/C++ LINUX – IT博客「建议收藏」今早ssjjll问我一个位操作的问题,原本以为非常easy的,可是程式的输出总是不尽人意。开始认为是编译器的错误,后来看文件才知道是自己学业不精,乃功力不足所致。失望!对C我一直认为全掌控了,而C++也练到了7、8重的境界,不料今日还是阴沟翻船。记下来,勿忘瓜耻!先看出现问题的代码:inta=32;intx=0xFFFFFFFF;cout<<int(0xFFFFFFFF…

  • 孙鑫Java视频教程(全12CD)

    孙鑫Java视频教程(全12CD)写了5年的C语言,最近由于工作关系,需要快速掌握JAVA,多亏孙鑫老师的视频,让我从入门到“精通”,推荐JAVA新人学习。特点:1、覆盖面全,讲解结合例子内容实在,看10课的介绍就知道2、如果有面向对象的基础,学起来更快3、附带PPT,可以方便摘录其中内容形成自己的学习笔记…http://www.sunxin.org/video/java.htm

  • 开心网教父外挂「建议收藏」

    开心网教父外挂「建议收藏」-实现定时执行任务,打开最小化到托盘,让这个小东西帮你自动打工赚钱吧,哈哈!欢迎使用,如果有好的建议请相互交流一下。后续会加入等多功能。下载29738673@qq.com新增自动火拼和自动追杀令功能!淘宝完整版注:需安装.net2.0运行环境,微软官方下载开心网教父验证码版只要5元,淘宝地址…

发表回复

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

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