有关本文本文档的表明
本文本文档根据ICSharpCode.SharpZipLib.dll的封装形式,常见的解压和压缩方式都早已包含以内,全是通过新项目实战演练累积出来的
1.基本上详细介绍
因为新项目中须要使用各种各样压缩将文件开展压缩免费下载,降低互联网的 *** 带宽,因此压缩是一个十分普遍的作用,针对压缩微软公司自身也保证了一些类库
微软公司内置压缩类ZipArchive类,合适NET FrameWork4.5才可以应用启用压缩手机软件指令实行压缩姿势,这一就必须计算机自身安裝压缩手机软件了应用第三方的压缩dll文件,一般使用较多的是(ICSharpCode.SharpZipLib.dll),免费下载dll ICSharpCode.SharpZipLib.zip
2.具体新项目
压缩单独文件,必须指定压缩级别压缩单独文件夹,必须指定压缩级别压缩好几个文件或是好几个文件夹对压缩包开展数据加密【用的相对比较少,具体情况也是有】立即解压,不用登陆密码必须登陆密码解压
2.1 压缩单独文件
写了2个方式,可以指定压缩级别,那样你的压缩包尺寸就不一样了
2.2 压缩单独文件夹
public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)
2.3 压缩好几个文件或是文件夹
1
public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)
2.4 对压缩包开展数据加密
1
public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)
2.5 立即解压,不用登陆密码
1
public void UnZip(string zipFilePath, string unZipDir)
3.演试图
3.ZipHelper下载
// All Rights Reserved , Copyright (C) 2016 , ZTO , Ltd .
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace ZTO.PicTest.Utilities
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
/// <summary>
/// Zip压缩协助类
/// 改动记录
/// 2015-09-16 版本号:1.0 YangHengLian 建立外键约束,留意类名的排列。
/// 2016-5-7 YangHengLian提升了可以适用好几个文件或是好几个文件夹装包成一个zip文件
/// 版本号:1.0
/// <author>
/// <name>YangHengLian</name>
/// <date>2015-09-16</date>
/// </author>
/// </summary>
public class ZipHelper
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="dirToZip"></param>
/// <param name="zipedFileName"></param>
/// <param name="compressionLevel">压缩率0(无压缩)9(压缩率更大)</param>
public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)
if (Path.GetExtension(zipedFileName) != ".zip")
zipedFileName = zipedFileName ".zip";
using (var zipoutputstream = new ZipOutputStream(File.Create(zipedFileName)))
zipoutputstream.SetLevel(compressionLevel);
Crc32 crc = new Crc32();
Hashtable fileList = GetAllFies(dirToZip);
foreach (DictionaryEntry item in fileList)
FileStream fs = new FileStream(item.Key.ToString(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
// ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(dirToZip.Length 1));
ZipEntry entry = new ZipEntry(Path.GetFileName(item.Key.ToString()))
DateTime = (DateTime) item.Value,
Size = fs.Length
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
zipoutputstream.PutNextEntry(entry);
zipoutputstream.Write(buffer, 0, buffer.Length);
/// <summary>
/// 获得全部文件
/// </summary>
/// <returns></returns>
public Hashtable GetAllFies(string dir)
Hashtable filesList = new Hashtable();
DirectoryInfo fileDire = new DirectoryInfo(dir);
if (!fileDire.Exists)
throw new FileNotFoundException("文件目录:" fileDire.FullName "沒有寻找!");
GetAllDirFiles(fileDire, filesList);
GetAllDirsFiles(fileDire.GetDirectories(), filesList);
return filesList;
/// <summary>
/// 获得一个文件夹下的全部文件夹里的文件
/// </summary>
/// <param name="dirs"></param>
/// <param name="filesList"></param>
public void GetAllDirsFiles(IEnumerable<DirectoryInfo> dirs, Hashtable filesList)
foreach (DirectoryInfo dir in dirs)
foreach (FileInfo file in dir.GetFiles("*.*"))
filesList.Add(file.FullName, file.LastWriteTime);
GetAllDirsFiles(dir.GetDirectories(), filesList);
/// <summary>
/// 获得一个文件夹下的文件
/// </summary>
/// <param name="dir">文件目录名字</param>
/// <param name="filesList">文件目录HastTable</param>
public static void GetAllDirFiles(DirectoryInfo dir, Hashtable filesList)
foreach (FileInfo file in dir.GetFiles("*.*"))
filesList.Add(file.FullName, file.LastWriteTime);
/// <summary>
/// 作用:解压zip文件格式的文档。
/// </summary>
/// <param name="zipFilePath">压缩包途径</param>
/// <param name="unZipDir">压缩包储放途径,为空时默认设置与压缩包同一级目录下,跟压缩文件同名的的文件夹名称</param>
/// <returns>缓解压力是不是取得成功</returns>
public void UnZip(string zipFilePath, string unZipDir)
if (zipFilePath == string.Empty)
throw new Exception("压缩包不可以为空!");
if (!File.Exists(zipFilePath))
throw new FileNotFoundException("压缩包不会有!");
//压缩包夹为空时默认设置与压缩包同一级目录下,跟压缩文件同名的的文件夹名称
if (unZipDir == string.Empty)
unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
if (!unZipDir.EndsWith("/"))
unZipDir = "/";
if (!Directory.Exists(unZipDir))
Directory.CreateDirectory(unZipDir);
using (var s = new ZipInputStream(File.OpenRead(zipFilePath)))
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if (!string.IsNullOrEmpty(directoryName))
Directory.CreateDirectory(unZipDir directoryName);
if (directoryName != null && !directoryName.EndsWith("/"))
if (fileName != String.Empty)
using (FileStream streamWriter = File.Create(unZipDir theEntry.Name))
int size;
byte[] data = new byte[2048];
while (true)
size = s.Read(data, 0, data.Length);
if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
/// <summary>
/// 缩小单独文档
/// </summary>
/// <param name="filePath">被缩小的文件目录(包括文件路径),文档的全途径</param>
/// <param name="zipedFileName">缩小后的文件目录(包括文件路径),储存的文件目录</param>
/// <param name="compressionLevel">压缩系数0(无缩小)到 9(压缩系数更大)</param>
public void ZipFile(string filePath, string zipedFileName, int compressionLevel = 9)
// 假如文档沒有寻找,则出错
if (!File.Exists(filePath))
throw new FileNotFoundException("文档:" filePath "沒有寻找!");
// 假如缩小后名称为空就默认设置应用源代码名字做为压缩包名字
if (string.IsNullOrEmpty(zipedFileName))
string oldValue = Path.GetFileName(filePath);
if (oldValue != null)
zipedFileName = filePath.Replace(oldValue, "") Path.GetFileNameWithoutExtension(filePath) ".zip";
// 假如缩小后的文件目录扩展名并不是zip,便是再加上zip,避免是一个错码文档
if (Path.GetExtension(zipedFileName) != ".zip")
zipedFileName = zipedFileName ".zip";
// 假如特定部位文件目录不会有,建立该文件目录 C:\Users\yhl\Desktop\大汉三通
string zipedDir = zipedFileName.Substring(0, zipedFileName.LastIndexOf("\\", StringComparison.Ordinal));
if (!Directory.Exists(zipedDir))
Directory.CreateDirectory(zipedDir);
// 被压缩包名字
string filename = filePath.Substring(filePath.LastIndexOf("\\", StringComparison.Ordinal) 1);
var streamToZip = new FileStream(filePath, FileMode.Open, FileAccess.Read);
var zipFile = File.Create(zipedFileName);
var zipStream = new ZipOutputStream(zipFile);
var zipEntry = new ZipEntry(filename);
zipStream.PutNextEntry(zipEntry);
zipStream.SetLevel(compressionLevel);
var buffer = new byte[2048];
Int32 size = streamToZip.Read(buffer, 0, buffer.Length);
zipStream.Write(buffer, 0, size);
try
while (size < streamToZip.Length)
int sizeRead = streamToZip.Read(buffer, 0, buffer.Length);
zipStream.Write(buffer, 0, sizeRead);
size = sizeRead;
finally
zipStream.Finish();
zipStream.Close();
streamToZip.Close();
/// <summary>
/// 缩小单独文档
/// </summary>
/// <param name="fileToZip">要实现缩小的文件夹名称,全途径</param>
/// <param name="zipedFile">缩小后形成的压缩包名,全途径</param>
public void ZipFile(string fileToZip, string zipedFile)
// 假如文档沒有寻找,则出错
if (!File.Exists(fileToZip))
throw new FileNotFoundException("特定要缩小的文档: " fileToZip " 不会有!");
using (FileStream fileStream = File.OpenRead(fileToZip))
byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer, 0, buffer.Length);
fileStream.Close();
using (FileStream zipFile = File.Create(zipedFile))
using (ZipOutputStream zipOutputStream = new ZipOutputStream(zipFile))
// string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") 1);
string fileName = Path.GetFileName(fileToZip);
var zipEntry = new ZipEntry(fileName)
DateTime = DateTime.Now,
IsUnicodeText = true
zipOutputStream.PutNextEntry(zipEntry);
zipOutputStream.SetLevel(5);
zipOutputStream.Write(buffer, 0, buffer.Length);
zipOutputStream.Finish();
zipOutputStream.Close();
/// <summary>
/// 缩小好几个文件目录或文档
/// </summary>
/// <param name="folderOrFileList">待缩小的文件或是文档,全途径文件格式,是一个结合</param>
/// <param name="zipedFile">缩小后的文件夹名称,全途径文件格式</param>
/// <param name="password">压宿登陆密码</param>
/// <returns></returns>
public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)
bool res = true;
using (var s = new ZipOutputStream(File.Create(zipedFile)))
s.SetLevel(6);
if (!string.IsNullOrEmpty(password))
s.Password = password;
foreach (string fileOrDir in folderOrFileList)
//是文件夹名称
if (Directory.Exists(fileOrDir))
res = ZipFileDictory(fileOrDir, s, "");
else
//文档
res = ZipFileWithStream(fileOrDir, s);
s.Finish();
s.Close();
return res;
/// <summary>
/// 带缩小流压缩单独文档
/// </summary>
/// <param name="fileToZip">要实现缩小的文件夹名称</param>
/// <param name="zipStream"></param>
/// <returns></returns>
private bool ZipFileWithStream(string fileToZip, ZipOutputStream zipStream)
//假如文档沒有寻找,则出错
if (!File.Exists(fileToZip))
throw new FileNotFoundException("特定要缩小的文档: " fileToZip " 不会有!");
//FileStream fs = null;
FileStream zipFile = null;
ZipEntry zipEntry = null;
bool res = true;
try
zipFile = File.OpenRead(fileToZip);
byte[] buffer = new byte[zipFile.Length];
zipFile.Read(buffer, 0, buffer.Length);
zipFile.Close();
zipEntry = new ZipEntry(Path.GetFileName(fileToZip));
zipStream.PutNextEntry(zipEntry);
zipStream.Write(buffer, 0, buffer.Length);
catch
res = false;
finally
if (zipEntry != null)
if (zipFile != null)
zipFile.Close();
GC.Collect();
GC.Collect(1);
return res;
/// <summary>
/// 递归法压缩文件夹方式
/// </summary>
/// <param name="folderToZip"></param>
/// <param name="s"></param>
/// <param name="parentFolderName"></param>
private bool ZipFileDictory(string folderToZip, ZipOutputStream s, string parentFolderName)
bool res = true;
ZipEntry entry = null;
FileStream fs = null;
Crc32 crc = new Crc32();
try
//建立现阶段文件夹名称
entry = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) "/")); //再加上 “/” 才会当作是文件夹名称建立
s.PutNextEntry(entry);
s.Flush();
//先压缩包,再递归法压缩文件夹
var filenames = Directory.GetFiles(folderToZip);
foreach (string file in filenames)
//开启压缩包
fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
entry = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) "/" Path.GetFileName(file)));
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
catch
res = false;
finally
if (fs != null)
fs.Close();
if (entry != null)
GC.Collect();
GC.Collect(1);
var folders = Directory.GetDirectories(folderToZip);
foreach (string folder in folders)
if (!ZipFileDictory(folder, s, Path.Combine(parentFolderName, Path.GetFileName(folderToZip))))
return false;
return res;
一 六款奥迪Q 五新车引导价: 三 五点 八 五- 五 七,业余化设计、否以看到许多 ,迈入了年夜 胆的一步。一个是轿跑,一个是S怎么比了,仇。 跑车A 五的一款新排质车型 二点0TFSI战下机能 活动 车型S 五邪式上市,能不克不及 告知 尔,Q 五 二0 一 六款 四0TFSI温馨型 四 七点...
然后正在运输、别购。点 五 五公斤由于 : 一公斤= 二斤以是 : 四点 五 五公斤= 四点 五 五x 二= 九点 一斤。 并且 看牌子,如今 是旺季,人力差没有多起码 要 一 五元了。 五降鲁花花熟油正在各天价钱 纷歧 样。不外 购 以前要注重不雅 察花熟油色泽,品级 下的更贱别购廉价 的,但量质...
部门 真体店有卖,票价,园地 很年夜 ,烟台至上海水车票正在 一 八0一 五 三0没有等,尔从前 来加入 祸州会铺中间 那里 的一个漫铺,廉价 的也才 四0多块钱。征询:空儿: 二0 一0年 七月 八日~ 二0 一0年 七月 一 二日 九:00- 一 七:00票价:常日 五0元;周六/日 七0元所...
枯耀 九曾经上市,今朝 华为商乡枯耀 九有如下版原:枯耀 九齐网通标配版 四GB+ 六 四GB¥ 二 二 九 九,根本 设置装备摆设 以下: 一。 知更鸟蓝多种配色否选,枯耀 九未于 二0 一 七年 六月份上市。华为商乡价钱 以下: 四+ 六 四G版 二 二 九 九元; 六,魅海蓝、枯耀旗高的一款智...
择要 : 二0 二 一年 一 二月 三 一日(阴历 二0 二 一年 一 一月 二 八日),朴槿惠获释粉丝挥应援棒喊尔爱您。 朴槿惠获释粉丝挥应援棒喊尔爱您。朴槿惠获释刹时 :粉丝挥舞应援棒全喊“尔爱您”,年夜 妈泣如雨下 。 南京空儿 二0 二 一年 一 二月 三 一日,韩国前总统朴槿惠于本地 空...
【西安咸阴群众否收费看爱偶艺 一个月】其真前些日子劣酷也上线了“西安群众收费看”限时收费私损铺播运动 (露咸阴)。 那波操做有点相似 于鸿星我克捐钱 行为 ,当然每一野的作法战力度皆纷歧 样。没有 晓得会有更多望频网站跟入吗必修 【西安咸阴群众否收费看爱偶艺 一个月】 一月 七日,爱偶艺VIP...