C# 压缩、解压缩
/// <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# 压缩、解压缩的更多相关文章
- Linux下的压缩解压缩命令详解
linux zip命令zip -r myfile.zip ./*将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzipunzip -o - ...
- Qt之QuaZIP(zip压缩/解压缩)
简述 QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开 ...
- hadoop的压缩解压缩,reduce端join,map端join
hadoop的压缩解压缩 hadoop对于常见的几种压缩算法对于我们的mapreduce都是内置支持,不需要我们关心.经过map之后,数据会产生输出经过shuffle,这个时候的shuffle过程特别 ...
- Linux/centos/redhat下各种压缩解压缩方式详解
1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...
- ICSharpCode.SharpZipLib实现压缩解压缩
最近,在项目中经常需要处理压缩和解压缩文件的操作.经过查找,发现了ICSharpCode.SharpZipLib.dll ,这是一个完全由c#编写的Zip, GZip.Tar . BZip2 类库,可 ...
- 使用 apache ant 轻松实现文件压缩/解压缩(转)
原文地址:http://blog.csdn.net/irvine007/article/details/6779492 maven配置ant包: <dependency> <grou ...
- 使用VC++压缩解压缩文件夹
前言 项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码, 都不是很称心, 现在把我自己实现的代码和大家分享. 要求: 1.使用Unicode(支持中文). 2.使用源代码.(不使用静态或 ...
- 基于ICSharpCode.SharpZipLib.Zip的压缩解压缩
原文:基于ICSharpCode.SharpZipLib.Zip的压缩解压缩 今天记压缩解压缩的使用,是基于开源项目ICSharpCode.SharpZipLib.Zip的使用. 一.压缩: /// ...
- Linux常用命令(第二版) --压缩解压缩命令
压缩解压缩命令: ----------.gz---------- 1.压缩 gzip[GNU zip]: /bin/gzip 格式: gzip 选项 [文件] #压缩文件,压缩后扩展名为.gz,Lin ...
- Linux下的常见压缩解压缩命令
Linux常见压缩解压缩命令 常见压缩文件扩展名 .Z compress 程序压缩的文件: .zip zip 程序压缩的文件: .gz gzip 程序压缩的文件: .bz2 bzip2 程序压缩的文件 ...
随机推荐
- 一个完整的http请求响应过程
一. HTTP请求和响应步骤 图片来自:理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的. 二.TCP/IP协 ...
- CSRF verification failed. Request aborted.错误解决办法
在Django项目的页面,提交form表单POST请求时,会出现报错:CSRF verification failed. Request aborted. 需要在form表单中加:{% csrf_to ...
- Vue组件定义
简介 组件是可复用的 Vue 实例. 本质上是一个对象,该对象包含data.computed.watch.methods.filters以及生命周期钩子等成员属性. 组件结构: { data(){ r ...
- Python 内置函数raw_input()和input()用法和区别
我们知道python接受输入的raw_input()和input() ,在python3 输入raw_input() 去掉乐,只要用input() 输入,input 可以接收一个Python表达式作为 ...
- C# 图片与Base64的相互转化
public ActionResult UploadSignature2(string src_data) { Class1.Base64StrToImage(src_data, "C:\\ ...
- Malware分析
//文章来源:http://www.2cto.com/Article/201312/265217.html by Kungen@CyberSword 想要查找恶意样本,首先要知道查找样本所需的基本信息 ...
- 攻防世界--simple-check-100
测试文件:https://adworld.xctf.org.cn/media/task/attachments/2543a3658d254c30a89e4ea7b8950c27.zip 这道题很坑了, ...
- 手工实现Array List和Linked List
Array List样例: /** * 增加泛型 * 自动增加数组容量 * 增加set.get方法:增加数组边界的检查 * 增加remove方法 */package cn.study.lu.four; ...
- struts2+jsp 遍历 <s:iterator><s:property>
直接把list用request传到jsp页面 <s:iterator var="u" value="#request.users"> <tr& ...
- 【leetcode】403. Frog Jump
题目如下: 解题思路:我的做法是建立一个字典dic,key为stone,value是一个set,里面存的是从前面的所有stone跳跃到当前stone的unit集合.例如stones=[0,1,2,3] ...