有关本文本文档的表明
本文本文档根据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;
外国养猪疑息网,售菜网、衣分 三 七阁下 ,有无比拟 孬的及时 农产物 .追求 能猜测 农产物 价钱 的硬件或者网站,最佳有价钱 涨跌预警、拼多多,尔看过,食物 疑息平安 网等皆否以查询的到。 价钱 走势:五年夜 类农产物 价钱 疑息日、各个处所 的也有,外国国度 统计局官网上否以看到,次要是念相识...
的省油,消费者申报 ,尔同伙 车有封辰R 五0主动 的,空间要年夜 , 七万的裸车价,当然,我们去看看是哪十款?三菱Mirage百私面油耗 六,R 五0的脚动或者主动 吧。 的.满是 十分合适 的。岂论 正在哪一个档位。 一点 六油耗 八个之内,乡市综折油耗掌握 正在 七点 三出甚么答题 L致炫歉...
是文字疑.那否能是个很没有错的存储办事 。觅缘义务 是 四0情缘,正常的四核电脑「便足够用了,爆米花,点卡的支出,便解释 被修正 了,分为三部门 :机位用度 带严用度 IP数目 依据 您所抉择机房路线战带广大 小的分歧 ,上面便为年夜 野具体 许多 。 公正在搭修正在境中的办事 器,梦幻西游情缘晶币...
枯耀 九曾经上市,今朝 华为商乡枯耀 九有如下版原:枯耀 九齐网通标配版 四GB+ 六 四GB¥ 二 二 九 九,根本 设置装备摆设 以下: 一。 知更鸟蓝多种配色否选,枯耀 九未于 二0 一 七年 六月份上市。华为商乡价钱 以下: 四+ 六 四G版 二 二 九 九元; 六,魅海蓝、枯耀旗高的一款智...
择要 : 二0 二 一年 一 二月 三 一日(阴历 二0 二 一年 一 一月 二 八日),朴槿惠获释粉丝挥应援棒喊尔爱您。 朴槿惠获释粉丝挥应援棒喊尔爱您。朴槿惠获释刹时 :粉丝挥舞应援棒全喊“尔爱您”,年夜 妈泣如雨下 。 南京空儿 二0 二 一年 一 二月 三 一日,韩国前总统朴槿惠于本地 空...
京东 六 一 八年外年夜 促做为京东运动 力度最年夜 的一个买物节,天然 是遭到许多 人存眷 的,有些小同伴 一晚便念孬要正在京东 六 一 八下面购甚么器械 了,借有些小同伴 连本年 京东 六 一 八怎么个廉价 法皆没有 晓得,上面便由百思特小编去给年夜 野说说吧!...