C # ZipHelper C # public class compression and decompression (rpm)

About this document

  This document ICSharpCode.SharpZipLib.dll package, commonly used compression and decompression method based on already encompassed, are accumulated through project combat

1. Basic Introduction

      Since the project will need to use a variety of compressed file compression download, reducing network bandwidth, so compression is a very common feature for compression Microsoft itself also provides some libraries

  1. Microsoft's own compression class ZipArchive class, can only be used for NET FrameWork4.5
  2. Call compression software compression action command execution, the computer itself will need to install a software compression
  3. Using third-party compression dll file, generally used most (ICSharpCode.SharpZipLib.dll), download dll  ICSharpCode.SharpZipLib.zip

2. The actual project

  1. Compress a single file, you need to specify the compression level
  2. Compressing a single folder, you need to specify the compression level
  3. Compress multiple files or multiple folders
  4. Compressed packet is encrypted with less [,] the actual situation there
  5. Direct unpack, without a password
  6. A password is required decompression

2.1 compress a single file

Write two methods, you can specify the compression level, so your compressed packet size is not the same

2.2 compressing a single folder

public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)

 

2.3 plurality of compressed files or folders

public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)

 

2.4 pairs of the compressed packet is encrypted

public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)

 

2.5 Direct unpack, without a password

public void UnZip(string zipFilePath, string unZipDir)

3. presentation charts

3.ZipHelper Download

复制代码
//-------------------------------------------------------------------------------------
// 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; } } }
复制代码
https://www.cnblogs.com/weixing/p/5478845.html

Guess you like

Origin www.cnblogs.com/xihong2014/p/12163479.html