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 程序压缩的文件 ...
随机推荐
- winform datagridview 绑定泛型集合变得不支持排序的解决方案
原文:winform datagridview 绑定泛型集合变得不支持排序的解决方案 案例: 环境:Winform程序 控件:Datagridview 现象:Datagridview控件绑定到List ...
- OPECV的配置
因为要做一点道路是别的东西,所以想用到OPENCV的一些东西.在网上找了一些OPENCCSHARP的代码,但是这方面的书籍或者资料还是不是特别的多,所以我就觉得可能还不是很好.主要的原因还是因为自己的 ...
- neovim初次安装使用
github下载neovim代码 按readme中安装,中间可能 要安装一些库 将vim的配置关联到nvim,发现和vim是一样的 ln -s ~/.vim ~/.config/nvim ln -s ...
- php WebService应用
<?php header ( "Content-Type: text/html; charset=gb2312" ); /* * 指定WebService路径并初始化一个We ...
- docker安装es
下载镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:6.8.1 创建容器并映射docker run -e ES_JAVA_OP ...
- django 多表查询并返回结果
(不喜勿喷,个人记录) 问题,有两张关联的表,表B的api_id关联表A的id 我想在页面上返回两张表查询之后的共同结果? 因为两张表的id是一样的,就先获取到表A的对象,然后拿表A的对象id当做表B ...
- 算法-python
选择排序:一个列表被分为无序列表和有序列表,选择排序就是拿无序列表的第一个和后面的每一个相比较,每一趟选择出最小的一个,添加进有序列表. def select_sort(list): for i in ...
- vim安装bundle和使用
一.准备工作 安装Git(因为下面我们选择的插件管理器需要使用到它)安装其他插件前首先需要选择一个Vim插件管理器,我这里选择的是Vundle,Vundle的工作过程中需要通过Git自动从远程创库同步 ...
- 【HDOJ6646】A + B = C(模拟)
题意 1<=a,b,c<=1e100000 思路: #include<bits/stdc++.h> using namespace std; typedef long long ...
- 【2019 Multi-University Training Contest 5】
01: 02:https://www.cnblogs.com/myx12345/p/11649221.html 03: 04:https://www.cnblogs.com/myx12345/p/11 ...