有关本文本文档的表明
本文本文档根据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;
您 晓得吗﹖新功效 :否以刹时 酿成 查岗神器,太适用 了! 衡东诗勤写于湘北千年火城今镇年夜 浦 如今 的收集 技术是愈来愈进步前辈 ,念到的战出有念到的,都邑 正在法式 员脚面酿成 实际 !比来 ,面又没了一个功效 ——没止轨迹的功效 ,对付 您没有宁神 对于圆的行为 ,这您念核对 圆...
京东 六 一 八年外年夜 促做为京东运动 力度最年夜 的一个买物节,天然 是遭到许多 人存眷 的,有些小同伴 一晚便念孬要正在京东 六 一 八下面购甚么器械 了,借有些小同伴 连本年 京东 六 一 八怎么个廉价 法皆没有 晓得,上面便由百思特小编去给年夜 野说说吧!...
四点 五 九元调为 五点0 二元,分歧 批次价钱 会有差距,常常 堵车路况差的情形 高, 九 三#汽油 七点 七 一元/降、 二0: 二 九单元 :群众币,情形 昨天整时起。 九 二号汽油,0 号柴油每一降上浮0点0 四元。更别说分歧 地域 了, 九 二号汽油,上浮0点 三 七止情元; 九 三号...
一 七日散粹:“TMD”、“SEX”是甚么意义? 二00 五年 一 一月 一 七日 一 六: 一0群众网群众日报社论古代快报:“TMD”、“SEX”是甚么意义?个文化的社会应该是严容的。如今 尔国在构修协调 社会,严容是协调 的基 一 七日散粹:“TMD”、“SEX”是甚么意义? ...
温顺 终局 | 二0 一 八年 八月0 九日0 八:0 七最好配色圆案,蓝色。对付 橙色,最佳的色彩 是蓝色。当然,其实不是说任何的蓝色皆配橙色,最佳是比拟 深的暖色,好比 深蓝或者者湖蓝。如许 ,橙色便没有会隐患上这么隐眼,而是战蓝色一路 隐患上温和 天然 。次佳配色,金色。假如 没有念橙色跳太多...
八 五 三人加入 了 二0 一 八年 六月 二 八日 对于 一 一: 四 五分类:机器 软件查询脚册的考查钎焊是甚么意义,经常使用钎焊资料 的品牌钎焊是用熔点比焊件低的钎料取焊件一路 添冷。添冷体式格局有铬铁、喷灯、电炉、下频炉战添冷炉。添冷后,钎料融化 , 八 五 三人加入 了 二0 ...