C#压缩文件夹至zip,不包含所选文件夹【转+修改】
转自园友:jimcsharp的博文C#实现Zip压缩解压实例【转】
在此基础上,对其中的压缩文件夹方法略作修正,并增加是否对父文件夹进行压缩的方法。(因为笔者有只压缩文件夹下的所有文件,却不想将选中的文件夹打入压缩文件的需求),话不多说,上代码:
其中需要依赖ICSharpCode.SharpZipLib.dll:
之后,新建一个类,代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- using ICSharpCode.SharpZipLib;
- using ICSharpCode.SharpZipLib.Zip;
- using ICSharpCode.SharpZipLib.Checksums;
- namespace Zip.Util
- {
- /// <summary>
- /// 适用与ZIP压缩
- /// </summary>
- public class ZipHelper
- {
- #region 压缩
- /// <summary>
- /// 递归压缩文件夹的内部方法
- /// </summary>
- /// <param name="folderToZip">要压缩的文件夹路径</param>
- /// <param name="zipStream">压缩输出流</param>
- /// <param name="parentFolderName">此文件夹的上级文件夹</param>
- /// <returns></returns>
- private static bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName)
- {
- bool result = true;
- string[] folders, files;
- ZipEntry ent = null;
- FileStream fs = null;
- Crc32 crc = new Crc32();
- try
- {
- ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/"));
- zipStream.PutNextEntry(ent);
- zipStream.Flush();
- files = Directory.GetFiles(folderToZip);
- foreach (string file in files)
- {
- fs = File.OpenRead(file);
- byte[] buffer = new byte[fs.Length];
- fs.Read(buffer, , buffer.Length);
- ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file)));
- ent.DateTime = DateTime.Now;
- ent.Size = fs.Length;
- fs.Close();
- crc.Reset();
- crc.Update(buffer);
- ent.Crc = crc.Value;
- zipStream.PutNextEntry(ent);
- zipStream.Write(buffer, , buffer.Length);
- }
- }
- catch
- {
- result = false;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- fs.Dispose();
- }
- if (ent != null)
- {
- ent = null;
- }
- GC.Collect();
- GC.Collect();
- }
- folders = Directory.GetDirectories(folderToZip);
- foreach (string folder in folders)
- if (!ZipDirectory(folder, zipStream, Path.GetFileName(folderToZip)))
- return false;
- return result;
- }
- /// <summary>
- /// 私有方法,增加是否包含父文件夹方法
- /// </summary>
- /// <param name="folderToZip">要压缩的文件夹路径</param>
- /// <param name="zipStream">压缩输出流</param>
- /// <param name="ContainParent">是否包含父文件夹</param>
- /// <returns></returns>
- private static bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, Boolean ContainParent)
- {
- string[] folders, files;
- ZipEntry ent = null;
- FileStream fs = null;
- Crc32 crc = new Crc32();
- try
- {
- if (ContainParent)
- {
- ent = new ZipEntry(Path.GetFileName(folderToZip) + "/");
- zipStream.PutNextEntry(ent);
- zipStream.Flush();
- }
- files = Directory.GetFiles(folderToZip);
- foreach (string file in files)
- {
- fs = File.OpenRead(file);
- byte[] buffer = new byte[fs.Length];
- fs.Read(buffer, , buffer.Length);
- if (ContainParent)
- {
- ent = new ZipEntry(Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file));
- }
- else
- {
- ent = new ZipEntry(Path.GetFileName(file));
- }
- ent.DateTime = DateTime.Now;
- ent.Size = fs.Length;
- fs.Close();
- crc.Reset();
- crc.Update(buffer);
- ent.Crc = crc.Value;
- zipStream.PutNextEntry(ent);
- zipStream.Write(buffer, , buffer.Length);
- }
- }
- catch
- {
- return false;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- fs.Dispose();
- }
- if (ent != null)
- {
- ent = null;
- }
- GC.Collect();
- GC.Collect();
- }
- folders = Directory.GetDirectories(folderToZip);
- if (ContainParent)
- {
- foreach (string folder in folders)
- if (!ZipDirectory(folder, zipStream, Path.GetFileName(folderToZip)))
- return false;
- }
- else
- {
- foreach (string folder in folders)
- if (!ZipDirectory(folder, zipStream, ""))
- return false;
- }
- return true;
- }
- /// <summary>
- /// 生成Zip
- /// </summary>
- /// <param name="folderToZip"></param>
- /// <param name="zipedFile"></param>
- /// <param name="IncludeParent">是否包含父文件夹</param>
- /// <returns></returns>
- public static bool ZipDirectory(string folderToZip, string zipedFile, Boolean IncludeParent)
- {
- bool result = false;
- if (!Directory.Exists(folderToZip))
- return result;
- ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));
- zipStream.SetLevel();
- result = ZipDirectory(folderToZip, zipStream, IncludeParent);
- zipStream.Finish();
- zipStream.Close();
- return result;
- }
- /// <summary>
- /// 压缩文件夹
- /// </summary>
- /// <param name="folderToZip">要压缩的文件夹路径</param>
- /// <param name="zipedFile">压缩文件完整路径</param>
- /// <param name="password">密码</param>
- /// <returns>是否压缩成功</returns>
- public static bool ZipDirectory(string folderToZip, string zipedFile, string password)
- {
- bool result = false;
- if (!Directory.Exists(folderToZip))
- return result;
- ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));
- zipStream.SetLevel();
- if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
- result = ZipDirectory(folderToZip, zipStream, "");
- zipStream.Finish();
- zipStream.Close();
- return result;
- }
- /// <summary>
- /// 压缩文件夹
- /// </summary>
- /// <param name="folderToZip">要压缩的文件夹路径</param>
- /// <param name="zipedFile">压缩文件完整路径</param>
- /// <returns>是否压缩成功</returns>
- public static bool ZipDirectory(string folderToZip, string zipedFile)
- {
- bool result = ZipDirectory(folderToZip, zipedFile, null);
- return result;
- }
- /// <summary>
- /// 压缩文件
- /// </summary>
- /// <param name="fileToZip">要压缩的文件全名</param>
- /// <param name="zipedFile">压缩后的文件名</param>
- /// <param name="password">密码</param>
- /// <returns>压缩结果</returns>
- public static bool ZipFile(string fileToZip, string zipedFile, string password)
- {
- bool result = true;
- ZipOutputStream zipStream = null;
- FileStream fs = null;
- ZipEntry ent = null;
- if (!File.Exists(fileToZip))
- return false;
- try
- {
- fs = File.OpenRead(fileToZip);
- byte[] buffer = new byte[fs.Length];
- fs.Read(buffer, , buffer.Length);
- fs.Close();
- fs = File.Create(zipedFile);
- zipStream = new ZipOutputStream(fs);
- if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
- ent = new ZipEntry(Path.GetFileName(fileToZip));
- zipStream.PutNextEntry(ent);
- zipStream.SetLevel();
- zipStream.Write(buffer, , buffer.Length);
- }
- catch
- {
- result = false;
- }
- finally
- {
- if (zipStream != null)
- {
- zipStream.Finish();
- zipStream.Close();
- }
- if (ent != null)
- {
- ent = null;
- }
- if (fs != null)
- {
- fs.Close();
- fs.Dispose();
- }
- }
- GC.Collect();
- GC.Collect();
- return result;
- }
- /// <summary>
- /// 压缩文件
- /// </summary>
- /// <param name="fileToZip">要压缩的文件全名</param>
- /// <param name="zipedFile">压缩后的文件名</param>
- /// <returns>压缩结果</returns>
- public static bool ZipFile(string fileToZip, string zipedFile)
- {
- bool result = ZipFile(fileToZip, zipedFile, null);
- return result;
- }
- /// <summary>
- /// 压缩文件或文件夹
- /// </summary>
- /// <param name="fileToZip">要压缩的路径</param>
- /// <param name="zipedFile">压缩后的文件名</param>
- /// <param name="password">密码</param>
- /// <returns>压缩结果</returns>
- public static bool Zip(string fileToZip, string zipedFile, string password)
- {
- bool result = false;
- if (Directory.Exists(fileToZip))
- result = ZipDirectory(fileToZip, zipedFile, password);
- else if (File.Exists(fileToZip))
- result = ZipFile(fileToZip, zipedFile, password);
- return result;
- }
- /// <summary>
- /// 压缩文件或文件夹
- /// </summary>
- /// <param name="fileToZip">要压缩的路径</param>
- /// <param name="zipedFile">压缩后的文件名</param>
- /// <returns>压缩结果</returns>
- public static bool Zip(string fileToZip, string zipedFile)
- {
- bool result = Zip(fileToZip, zipedFile, null);
- return result;
- }
- #endregion
- #region 解压
- /// <summary>
- /// 解压功能(解压压缩文件到指定目录)
- /// </summary>
- /// <param name="fileToUnZip">待解压的文件</param>
- /// <param name="zipedFolder">指定解压目标目录</param>
- /// <param name="password">密码</param>
- /// <returns>解压结果</returns>
- public static bool UnZip(string fileToUnZip, string zipedFolder, string password)
- {
- bool result = true;
- FileStream fs = null;
- ZipInputStream zipStream = null;
- ZipEntry ent = null;
- string fileName;
- if (!File.Exists(fileToUnZip))
- return false;
- if (!Directory.Exists(zipedFolder))
- Directory.CreateDirectory(zipedFolder);
- try
- {
- zipStream = new ZipInputStream(File.OpenRead(fileToUnZip));
- if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
- while ((ent = zipStream.GetNextEntry()) != null)
- {
- if (!string.IsNullOrEmpty(ent.Name))
- {
- fileName = Path.Combine(zipedFolder, ent.Name);
- fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi
- if (fileName.EndsWith("\\"))
- {
- Directory.CreateDirectory(fileName);
- continue;
- }
- fs = File.Create(fileName);
- int size = ;
- byte[] data = new byte[size];
- while (true)
- {
- size = zipStream.Read(data, , data.Length);
- if (size > )
- fs.Write(data, , data.Length);
- else
- break;
- }
- }
- }
- }
- catch
- {
- result = false;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- fs.Dispose();
- }
- if (zipStream != null)
- {
- zipStream.Close();
- zipStream.Dispose();
- }
- if (ent != null)
- {
- ent = null;
- }
- GC.Collect();
- GC.Collect();
- }
- return result;
- }
- /// <summary>
- /// 解压功能(解压压缩文件到指定目录)
- /// </summary>
- /// <param name="fileToUnZip">待解压的文件</param>
- /// <param name="zipedFolder">指定解压目标目录</param>
- /// <returns>解压结果</returns>
- //public static bool UnZip(string fileToUnZip, string zipedFolder)
- //{
- // bool result = UnZip(fileToUnZip, zipedFolder, null);
- // return result;
- //}
- /// <summary>
- /// 解压功能(解压压缩文件到指定目录)
- /// </summary>
- /// <param name="fileToUnZip">待解压的文件</param>
- /// <param name="zipedFolder">指定解压目标目录</param>
- /// <returns>解压结果</returns>
- public static bool UnZip(string fileToUnZip, string zipedFolder)
- {
- if (Directory.Exists(zipedFolder))
- {
- Directory.Delete(zipedFolder, true);
- }
- Directory.CreateDirectory(zipedFolder);
- ZipInputStream zipInputStream = new ZipInputStream(File.Open(fileToUnZip, FileMode.Open));
- ZipEntry zipEntryFromZippedFile = zipInputStream.GetNextEntry();
- while (zipEntryFromZippedFile != null)
- {
- if (zipEntryFromZippedFile.IsFile)
- {
- FileInfo fInfo = new FileInfo(string.Format(zipedFolder + "\\{0}", zipEntryFromZippedFile.Name));
- if (!fInfo.Directory.Exists) fInfo.Directory.Create();
- FileStream file = fInfo.Create();
- byte[] bufferFromZip = new byte[zipInputStream.Length];
- zipInputStream.Read(bufferFromZip, , bufferFromZip.Length);
- file.Write(bufferFromZip, , bufferFromZip.Length);
- file.Close();
- }
- zipEntryFromZippedFile = zipInputStream.GetNextEntry();
- }
- zipInputStream.Close();
- return true;
- }
- #endregion
- }
- }
压缩文件夹,是否包含父文件夹,调用:
- public static bool ZipDirectory(string folderToZip, string zipedFile, Boolean IncludeParent)
- 解压缩功能我也将原方法注释了,重新找了一个方法,因为原方法在将.xml文件解压出来的时候,会在末尾加入一堆NULNULNULNUL.......,大家可以自己去尝试下。
2017.8.12补充:
解压自己的打包的压缩包报错:EOF in header.......
准备换winrar.
C#压缩文件夹至zip,不包含所选文件夹【转+修改】的更多相关文章
- PHP 多文件打包下载 zip
<?php $zipname = './photo.zip'; //服务器根目录下有文件夹public,其中包含三个文件img1.jpg, img2.jpg, img3.jpg,将这三个文件打包 ...
- 如何使用Beyond Compare 对比差异文件【制作Patch(补丁包)文件】
场景:研发部的代码从SVN变更至GIt,通过Jenkins每天自动生成程序包. 如需要获取单独的程序包更新,而不是整个程序包覆盖更新,这时候就需要用到Beyond Compare 对比工具 操作步骤1 ...
- 命令行方式调用winrar对文件夹进行zip压缩示例代码
调用winRAR进行压缩 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- Python压缩指定文件及文件夹为zip
Python压缩指定的文件及文件夹为.zip 代码: def zipDir(dirpath,outFullName): """ 压缩指定文件夹 :param dirpat ...
- Java实现文件压缩与解压[zip格式,gzip格式]
Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...
- Linux命令(十六) 压缩或解压缩文件和目录 zip unzip
目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 zip 是 Linux 系统下广泛使用的压缩程序,文件压缩后扩展名为 ".zip". zip 命令用来将文件 ...
- linux下压缩成zip文件解压zip文件
linux zip命令的基本用法是: zip [参数] [打包后的文件名] [打包的目录路径] linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏 ...
- java笔试题: ——将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面
将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面 import java.io.*; import java.util.zip.ZipEntry; import java.uti ...
- gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)
gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩 ...
随机推荐
- android账号与同步之账号管理
在android提供的sdk中,samples文件夹下有一个叫SampleSyncAdapter的演示样例,它是一个账号与同步的实例,比方Google原始的android手机能够使用Google账号进 ...
- 玩转单元測试之WireMock -- Web服务模拟器
WireMock 是一个灵活的库用于 Web 服务測试,和其它測试工具不同的是.WireMock 创建一个实际的 HTTPserver来执行你的 Web 服务以方便測试. 它支持 HTTP 响应存根. ...
- 《炉石传说》架构设计赏析(4):Asset管理
欢迎转载,请注明作者[燕良@游戏开发]及原文地址:http://blog.csdn.net/neil3d/article/details/39580197 另外.欢迎大家来我的QQ群交流各种游戏引擎相 ...
- windows console Kill PID 端口查看
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- 利用JFreeChart生成多轴图表(7) (转自 JSP开发技术大全)
利用JFreeChart生成多轴图表(7) (转自 JSP开发技术大全) 14.7 利用JFreeChart生成多轴图表 通过JFreeChart插件还可以生成拥有多个坐标轴的图表,简称多轴图表.在生 ...
- CodeFirst建模:DataAnotation
示例一 新建一个控制台应用程序,并安装entityframework 新建一个文件Blog.cs类,输入以下代码: using System.ComponentModel.DataAnnotation ...
- 论如何O(1)快速乘
然而并没有什么好论的... 直接贴代码算了... ll Mul(ll x,ll y,ll Mod){ x=(x%Mod+Mod)%Mod;y=(y%Mod+Mod)%Mod; return (x*y- ...
- Centos7 配置防火墙 firewall
一.firewall 1.从CentOS7开始,默认使用firewall来配置防火墙,没有安装iptables(旧版默认安装). 2.firewall的配置文件是以xml的格式,存储在 /usr/li ...
- sqlserver新加一自增长的列,并且更新为行号
--查询行号 select row_number()over(order by CHECKTIME )as RowNum,*from CHECKINOUT --更新id列为行号 update CHEC ...
- 公司5:JrVue表格
组件名称:jr-dynamic-query-table 组件布局 table组件名称: jr-dynamic-query-table 分页组件名称: el-pagination <div re ...