接口

public interface IUnZip
{
/// <summary>
/// 功能:解压zip格式的文件。
/// </summary>
/// <param name="zipFilePath">压缩文件路径</param>
/// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
/// <param name="password">压缩包密码</param>
/// <returns>解压后文件所在的文件夹</returns>
string UnZipFile(string zipFilePath, string unZipDir = null, string password = null);
} public interface IZip
{
/// <summary>
/// 将选定的文件压入一个目标zip中
/// </summary>
/// <param name="list">选定的文件/文件夹(路径的集合)</param>
/// <param name="targetFileName">压缩后得到的zip保存路径</param>
/// <param name="password">压缩包密码</param>
/// <param name="overwrite">如果Zip文件已存在,是否覆盖</param>
/// <param name="level">压缩等级0—9</param>
/// <returns>压缩包路径</returns>
void Compress(List<string> list, string targetFileName, string password = null, bool overwrite = true, int level = 9); /// <summary>
/// 将选定的文件压入一个目标zip中
/// </summary>
/// <param name="fileOrDir">选定的文件/文件夹</param>
/// <param name="targetFileName">压缩后得到的zip保存路径</param>
/// <param name="password">压缩包密码</param>
/// <param name="overwrite">如果Zip文件已存在,是否覆盖</param>
/// <param name="level">压缩等级0—9</param>
/// <returns>压缩包路径</returns>
void Compress(string fileOrDir, string targetFileName, string password = null, bool overwrite = true, int level = 9);
} public interface IZipHelper:IZip,IUnZip
{
}

实现

   public class ZipHelper : IZipHelper
{
#region 压缩文件 /// <inheritdoc/>
public void Compress(string fileOrDir, string targetFileName, string password = null, bool overwrite = true, int level = 9)
{
List<string> list = new List<string> { fileOrDir };
Compress(list, targetFileName, password, overwrite,level);
} /// <inheritdoc/>
public void Compress(List<string> list, string targetFileName, string password = null, bool overwrite = true,int level = 9)
{
CheckForCompress(list, targetFileName, overwrite); //如果已经存在目标文件,删除
if (File.Exists(targetFileName))
{
File.Delete(targetFileName);
} ZipOutputStream zips = null;
FileStream fileStream = null;
try
{
fileStream = File.Create(targetFileName);
zips = new ZipOutputStream(fileStream);
zips.SetLevel(level % 10); //压缩等级
zips.Password = password;
foreach (string dir in list)
{
if (File.Exists(dir))
{
AddFile("",dir, zips);
}
else
{
CompressFolder("", dir, zips);
}
}
zips.Finish();
}
catch { throw; }
finally
{
if(fileStream!= null)
{
fileStream.Close();
fileStream.Dispose();
}
if(zips!= null)
{
zips.Close();
zips.Dispose();
}
}
} #region private
private void CheckForCompress(List<string> files, string targetFileName, bool overwrite)
{
//因为files可能来自不同的文件夹,所以不方便自动提供一个默认文件夹,需要提供
if (!overwrite && File.Exists(targetFileName))
{
throw new Exception("目标zip文件已存在!");
} //待压入的文件或文件夹需要真实存在
foreach (var item in files)
{
if (!File.Exists(item) && !Directory.Exists(item))
{
throw new Exception($"文件/文件夹【{item}】不存在!");
}
} //不能有同名的文件/文件夹
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var item in files)
{
string item_ = item.TrimEnd('/', '\\');
string fileName = Path.GetFileName(item_);
if (dic.ContainsKey(fileName))
{
throw new Exception($"选中的文件/文件夹中存在同名冲突:【{dic[fileName]}】,【{item_}】");
}
else
{
dic[fileName] = item_;
}
}
} private void AddFile(string orignalDir, string file, ZipOutputStream zips)
{
//文件
FileStream StreamToZip = null;
try
{
//加入ZIP文件条目(为压缩文件流提供一个容器)
StreamToZip = new FileStream(file, FileMode.Open, FileAccess.Read);
string fileName = Path.GetFileName(file);
if (!string.IsNullOrEmpty(orignalDir))
{
fileName = orignalDir + Path.DirectorySeparatorChar + fileName;
}
ZipEntry z = new ZipEntry(fileName);
zips.PutNextEntry(z); //写入文件流
int pack = 10240; //10Kb
byte[] buffer = new byte[pack]; int size = StreamToZip.Read(buffer, 0, buffer.Length);
while (size > 0)
{
zips.Write(buffer, 0, size);
size = StreamToZip.Read(buffer, 0, buffer.Length);
}
}
catch { throw; }
finally
{
if (StreamToZip != null)
{
StreamToZip.Close();
StreamToZip.Dispose();
}
}
}
private void AddFolder(string orignalDir, string folder, ZipOutputStream zips)
{
//文件夹
folder = folder.TrimEnd('/','\\');
string fileName = Path.GetFileName(folder);
if (!string.IsNullOrEmpty(orignalDir))
{
fileName = orignalDir + Path.DirectorySeparatorChar + fileName ;
}
fileName += Path.DirectorySeparatorChar;
ZipEntry z = new ZipEntry(fileName);
zips.PutNextEntry(z);
}
/// <summary>
/// 递归压缩文件夹内所有文件和子文件夹
/// </summary>
/// <param name="orignalDir">外层文件夹</param>
/// <param name="dir">被压缩文件夹</param>
/// <param name="zips">流</param>
private void CompressFolder(string orignalDir,string dir, ZipOutputStream zips)
{
// 压缩当前文件夹下所有文件
string[] names = Directory.GetFiles(dir);
foreach (string fileName in names)
{
AddFile(orignalDir,fileName, zips);
}
// 压缩子文件夹
names = Directory.GetDirectories(dir);
foreach (string folderName in names)
{
AddFolder(orignalDir, folderName, zips); string _orignalDir = Path.GetFileName(folderName);
if (!string.IsNullOrEmpty(orignalDir))
{
_orignalDir = orignalDir + Path.DirectorySeparatorChar + _orignalDir;
}
CompressFolder(_orignalDir, folderName, zips);
}
}
#endregion private #endregion 压缩文件 #region 解压文件 /// <inheritdoc/>
public string UnZipFile(string zipFilePath, string unZipDir = null,string password = null)
{
if (!File.Exists(zipFilePath))
{
throw new Exception($"压缩文件【{zipFilePath}】不存在!");
}
//解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
if (string.IsNullOrWhiteSpace(unZipDir))
{
unZipDir = Path.GetDirectoryName(zipFilePath);
string name = Path.GetFileNameWithoutExtension(zipFilePath);
unZipDir = Path.Combine(unZipDir, name);
} string unZipDir2 = unZipDir;
char lastChar = unZipDir[unZipDir.Length - 1];
if (lastChar != '/' && lastChar != '\\')
{
unZipDir += Path.DirectorySeparatorChar;
} if (!Directory.Exists(unZipDir))
Directory.CreateDirectory(unZipDir); //解压
UnZipProcess(zipFilePath, unZipDir, password); return unZipDir2;
}
private void UnZipProcess(string zipFilePath, string unZipDir, string password)
{
ZipInputStream zipInput = null;
FileStream fileStream = null;
try
{
fileStream = File.OpenRead(zipFilePath);
zipInput = new ZipInputStream(fileStream);
zipInput.Password = password;
ZipEntry theEntry;
while ((theEntry = zipInput.GetNextEntry()) != null)
{
string tempPath = unZipDir + theEntry.Name;
if (theEntry.IsDirectory)
{
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(tempPath);
}
}
else
{
using (FileStream streamWriter = File.Create(tempPath))
{
byte[] buffer = new byte[10240];
int size = zipInput.Read(buffer, 0, buffer.Length);
while (size > 0)
{
streamWriter.Write(buffer, 0, size);
size = zipInput.Read(buffer, 0, buffer.Length);
}
}
}
}
}
catch
{
throw;
}
finally
{
if (fileStream != null)
{
fileStream.Close();
fileStream.Dispose();
}
if (zipInput != null)
{
zipInput.Close();
zipInput.Dispose();
}
}
} #endregion
}

使用SharpZipLib实现文件压缩、解压的更多相关文章

  1. 使用SharpZIpLib写的压缩解压操作类

    使用SharpZIpLib写的压缩解压操作类,已测试. public class ZipHelper { /// <summary> /// 压缩文件 /// </summary&g ...

  2. Linux 之 文件压缩解压

    文件压缩解压 参考教程:[千峰教育] 命令: gzip: 作用:压缩文件,只能是单个文件,不能是多个,也不能是目录. 格式:gzip file 说明:执行命令会生成file.gz,删除原来的file ...

  3. linux驱动系列之文件压缩解压小节(转)

    转至网页:http://www.jb51.net/LINUXjishu/43356.html Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通 ...

  4. 分享一个ASP.NET 文件压缩解压类 C#

    需要引用一个ICSharpCode.SharpZipLib.dll using System; using System.Collections.Generic; using System.Linq; ...

  5. C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用

    工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...

  6. iOS - File Archive/UnArchive 文件压缩/解压

    1.ZipArchive 方式 ZipArchive 只能对 zip 类文件进行压缩和解压缩 GitHub 网址:https://github.com/ZipArchive/ZipArchive Zi ...

  7. linux文件压缩解压命令

    01-.tar格式解包:[*******]$ tar xvf FileName.tar打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩! ...

  8. Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接

    作业一:1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/passwd /etc/group > /1.txt2) 将用户信息数据库文件和用户 ...

  9. linux笔记:linux常用命令-压缩解压命令

    压缩解压命令:gzip(压缩文件,不保留原文件.这个命令不能压缩目录) 压缩解压命令:gunzip(解压.gz的压缩文件) 压缩解压命令:tar(打包压缩目录或者解压压缩文件.打包的意思是把目录打包成 ...

  10. linux命令:压缩解压命令

    压缩解压命令:gzip 命令名称:gzip 命令英文原意:GNU zip 命令所在路径:/bin/gzip 执行权限:所有用户 语法:gzip 选项  [文件] 功能描述:压缩文件 压缩后文件格式:g ...

随机推荐

  1. Bonobo创建新库出错,解决方案

    创建新库出错如下: Native library pre-loader is trying to load native SQLite library "D:\wwwroot\localho ...

  2. HTML5新增及移除的元素

    HTML经过10多年的发展,其元素经历了废弃与不断重新定义的过程.为了更好的处理现在的互联网应用,HTML5新增了图形绘制.多媒体播放.页面结构.应用程序存储.网络工作等新元素.http://hove ...

  3. Python 基础之四初识Python数据类型

    数字 Int,整型 Float,浮点型 Long,长整型 布尔 字符串 列表 元组 字典 1.数字 INT(整型) 在32位系统上,整数的位数为32位,取值范围为-2**31~2**31-1,即-21 ...

  4. 《JS实现复制内容到剪贴板功能,可兼容所有PC浏览器,不兼容手机端》

    前记:本来原生的JS是有提供一个函数来实现这个功能(window.clipboardData),但是很遗憾,这个函数仅仅支持IE和FF浏览器,所以基本用处不大.下边介绍的是一个第三方插件库(ZeroC ...

  5. jQ图片列表光标移动动画

    本效果使用jQuery和CSS实现了图片列表,当鼠标移入时图片向左微动,移出则复原. 效果展示: http://hovertree.com/texiao/jquery/88/ 效果图如下: 其中的jQ ...

  6. 关于input标签和placeholder在IE8,9下的兼容问题

    一. input常用在表单的输入,包括text,password,H5后又新增了许多type属性值,如url, email, member等等,考虑到非现代浏览器的兼容性问题,这些新的type常用在移 ...

  7. NFR

    你NFR了吗? NFR,即非功能性需求 (Non -Functional Requirements) ,即系统能够完成所期望的工作的性能与质量.具体包括如下内容: – 效率: 软件实现其功能所需要的计 ...

  8. Group by

    分组语句必须和聚合函数在一起使用, group by子句负责将数据分成逻辑组,聚合函数对每一组进行统计计算 group by 必须放到 select 语句后面,如果select语句中有where子句, ...

  9. Webform(七)——内置对象(Session、Application)和Repeater的Command操作

    内置对象:用于页面之间的数据交互 为什么要使用这么内置对象?因为HTTP的无状态性. 一.内置对象 (一)Session 跟Cookies一样用来存储用户数据 1.Session.Cookies对比 ...

  10. Oracle数据字典

    数据字典-简介 Oracle数据字典的名称由前缀和后缀组成,使用下划线"_"连接,其代表的含义如下: ● DBA_:包含数据库实例的所有对象信息. ● V$_:当前实例的动态视图, ...