/// <summary>
/// 压缩文件 FNameArry 为客户端传回来的文件列表:文件名数组,压缩包的名称strZipName
/// </summary>
/// <param name="FNameArry">文件名数组</param>
/// <param name="strZipName">压缩包的名称</param>
public void ZipFile(string[] FNameArry string strZipName)
{ if (strZipName.Length != ) //压缩包名称不为空
{
ZipOutputStream u = new ZipOutputStream(File.Create(FileDir + strZipName)); //新建压缩文件流 “ZipOutputStream”
for (int i = ; i < FNameArry.Length; i++)
{
if (FNameArry[i] != "") //分离出来的文件名不为空
{
this.AddZipEntry(FNameArry[i] u out u); //向压缩文件流加入内容
}
}
u.Finish(); // 结束压缩
u.Close();
}
} //添加压缩项目:p 为需压缩的文件或文件夹; u 为现有的源ZipOutputStream; out j为已添加“ZipEntry”的“ZipOutputStream”
public void AddZipEntry(string p ZipOutputStream u out ZipOutputStream j)
{
string s = FileDir + p; if (Directory.Exists(s)) //文件夹的处理
{
DirectoryInfo di = new DirectoryInfo(s); //***********以下内容是修订后添加的*********** if (di.GetDirectories().Length <= ) //没有子目录
{
ZipEntry z = new ZipEntry(p + "/"); //末尾“/”用于文件夹的标记
u.PutNextEntry(z);
} //***************以上内容是修订后添加的*************** foreach (DirectoryInfo tem in di.GetDirectories()) //获取子目录
{
ZipEntry z = new ZipEntry(this.ShortDir(tem.FullName) + "/"); //末尾“/”用于文件夹的标记
u.PutNextEntry(z); //此句不可少,否则空目录不会被添加
s = this.ShortDir(tem.FullName);
this.AddZipEntry(s u out u); //递归
}
foreach (FileInfo temp in di.GetFiles()) //获取此目录的文件
{
s = this.ShortDir(temp.FullName);
this.AddZipEntry(s u out u); //递归
}
}
else if (File.Exists(s)) //文件的处理
{
u.SetLevel(); //压缩等级
FileStream f = File.OpenRead(s);
byte[] b = new byte[f.Length];
f.Read(b b.Length); //将文件流加入缓冲字节中
ZipEntry z = new ZipEntry(this.ShortDir(s));
u.PutNextEntry(z); //为压缩文件流提供一个容器
u.Write(b b.Length); //写入字节
f.Close();
}
j = u; //返回已添加数据的“ZipOutputStream”
} /// <summary>
/// 解压
/// </summary>
/// <param name="FNameArry">文件名参数列表</param>
public void UnZipFile(string[] FNameArry) //解压缩
{
int i2 = ; //防止名称冲突的参数
for (int j = ; j < FNameArry.Length; j++)
{
if (FNameArry[j] != "")
{
string un_time = System.DateTime.Now.ToShortDateString() + "-" + System.DateTime.Now.Hour.ToString() + "-" + System.DateTime.Now.Minute.ToString() + "-" + (System.DateTime.Now.Second + i2).ToString();
string un_dir = FileDir + "Unzip-" + un_time;
Directory.CreateDirectory(un_dir); //创建以解压时间为名称的文件夹
ZipInputStream f = new ZipInputStream(File.OpenRead(FileDir + FNameArry[j])); //读取压缩文件,并用此文件流新建 “ZipInputStream”对象 A: ZipEntry zp = f.GetNextEntry(); //获取解压文件流中的项目。 另注(我的理解):在压缩包里每个文件都以“ZipEntry”形式存在,其中包括存放文件的目录信息。如果空目录被压缩,该目录下将出现一个名称为空、大小为 0 、“Crc”属性为 00000000 的“文件”。此文件只是个标记,不会被解压。 while (zp != null)
{
string FNameArry2;
if (zp.Name.IndexOf("/") >= ) //获取文件的目录信息
{
int tmp1 = zp.Name.LastIndexOf("/");
FNameArry2 = zp.Name.Substring( tmp1);
Directory.CreateDirectory(un_dir + "/" + FNameArry2 + "/"); //必须先创建目录,否则解压失败 --- (A) 关系到下面的步骤(B)
}
if (!zp.IsDirectory && zp.Crc != 00000000L) //此“ZipEntry”不是“标记文件”
{
int i = ;
byte[] b = new byte[i]; //每次缓冲 2048 字节
FileStream s = File.Create(un_dir + "/" + zp.Name); //(B)-新建文件流
while (true) //持续读取字节,直到一个“ZipEntry”字节读完
{
i = f.Read(b b.Length); //读取“ZipEntry”中的字节
if (i > )
{
s.Write(b i); //将字节写入新建的文件流
}
else
{
break; //读取的字节为 0 ,跳出循环
}
}
s.Close();
}
goto A; //进入下一个“ZipEntry”
}
f.Close();
i2++;
}
}
}

C# 压缩、解压缩的更多相关文章

  1. Linux下的压缩解压缩命令详解

    linux zip命令zip -r myfile.zip ./*将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzipunzip -o - ...

  2. Qt之QuaZIP(zip压缩/解压缩)

    简述 QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开 ...

  3. hadoop的压缩解压缩,reduce端join,map端join

    hadoop的压缩解压缩 hadoop对于常见的几种压缩算法对于我们的mapreduce都是内置支持,不需要我们关心.经过map之后,数据会产生输出经过shuffle,这个时候的shuffle过程特别 ...

  4. Linux/centos/redhat下各种压缩解压缩方式详解

    1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...

  5. ICSharpCode.SharpZipLib实现压缩解压缩

    最近,在项目中经常需要处理压缩和解压缩文件的操作.经过查找,发现了ICSharpCode.SharpZipLib.dll ,这是一个完全由c#编写的Zip, GZip.Tar . BZip2 类库,可 ...

  6. 使用 apache ant 轻松实现文件压缩/解压缩(转)

    原文地址:http://blog.csdn.net/irvine007/article/details/6779492 maven配置ant包: <dependency> <grou ...

  7. 使用VC++压缩解压缩文件夹

    前言   项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码,  都不是很称心, 现在把我自己实现的代码和大家分享. 要求: 1.使用Unicode(支持中文). 2.使用源代码.(不使用静态或 ...

  8. 基于ICSharpCode.SharpZipLib.Zip的压缩解压缩

    原文:基于ICSharpCode.SharpZipLib.Zip的压缩解压缩 今天记压缩解压缩的使用,是基于开源项目ICSharpCode.SharpZipLib.Zip的使用. 一.压缩: /// ...

  9. Linux常用命令(第二版) --压缩解压缩命令

    压缩解压缩命令: ----------.gz---------- 1.压缩 gzip[GNU zip]: /bin/gzip 格式: gzip 选项 [文件] #压缩文件,压缩后扩展名为.gz,Lin ...

  10. Linux下的常见压缩解压缩命令

    Linux常见压缩解压缩命令 常见压缩文件扩展名 .Z compress 程序压缩的文件: .zip zip 程序压缩的文件: .gz gzip 程序压缩的文件: .bz2 bzip2 程序压缩的文件 ...

随机推荐

  1. js如何获取到select的option值???

    1.获得选项option的值 var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIn ...

  2. Python 数据分析中金融数据的来源库和简单操作

    目录 金融数据 pandas-datareader TuShare 金融学图表 案例 金融数据 数据分析离不开数据的获取,这里介绍几种常用的获取金融方面数据的方法. pandas-datareader ...

  3. Mysql日期和字符的相互转换

    今天从网上查到了一些关于MySQL数据库的日期转换函数的转换的用法,在这里记录一下: mysql日期和字符相互转换 date_format(date,'%Y-%m-%d') ------------- ...

  4. 什么是服务端伪造(SSRF)

    什么是服务端伪造(SSRF) 原文:GitHub Pages and Single-Page Apps 译者:neal1991 welcome to star my articles-translat ...

  5. nginx 实现浏览器文件下载服务

    nginx 实现浏览器文件下载服务 2018/07/21 这里记录如何用 nginx 搭建一个简易的 file server,实现在浏览器上进行文件的下载操作. 要实现文件下载功能非常非常容易,不需要 ...

  6. 1142. Maximal Clique (25)

    A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the ...

  7. java 简单工厂&抽象工厂

    工厂模式:就是提供一个实例化对象的接口,让子类去决定实现哪个具体对象 1:简单工厂 public abstract class Person { } public class XiaoLi exten ...

  8. yield与gen.coroutine

    def d(): for i in range(2): yield i def b(): yield d() print("b") yield "bb" def ...

  9. Django登录(含随机生成图片验证码)注册实例

    登录,生成随机图片验证码 一.登录 - 随机生成图片验证码 1.随机生成验证码 Python随机生成图片验证码,需要使用PIL模块,安装方式如下: pip3 install pillow 1)创建图片 ...

  10. INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

    [转] https://www.mobibrw.com/2016/3949 adb install 一个apk错误: INSTALL_FAILED_ALREADY_EXISTS 应用已存在,使用 ad ...