博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ICSharpCode.SharpZipLib.Zip实现压缩与解压缩
阅读量:7055 次
发布时间:2019-06-28

本文共 13200 字,大约阅读时间需要 44 分钟。

使用开源类库ICSharpCode.SharpZipLib.Zip可以实现压缩与解压缩功能,源代码和DLL可以从下载;

 

有两种方式可以实现压缩与解压缩,这里只提供了ZIP格式;

1、DLL本身提供的快速压缩与解压缩,直接代码:

using System;using ICSharpCode.SharpZipLib.Zip;namespace Zip{    public static class FastZipHelper    {        #region CreateZipFile        public static bool CreateZip(string zipFileName, string sourceDirectory, bool recurse, string fileFilter,                                     string directoryFilter, bool createEmptyDirectories,                                     bool restoreAttributesOnExtract, bool restoreDateTimeOnExtract)        {            try            {                FastZip fastZip = new FastZip();                fastZip.CreateEmptyDirectories = createEmptyDirectories;                fastZip.RestoreAttributesOnExtract = restoreAttributesOnExtract;                fastZip.RestoreDateTimeOnExtract = restoreDateTimeOnExtract;                fastZip.CreateZip(zipFileName, sourceDirectory, recurse, fileFilter, directoryFilter);                return true;            }            catch (Exception ex)            {                return false;            }        }        public static bool CreateZip(string zipFileName, string sourceDirectory, bool recurse, string fileFilter,                                     string directoryFilter, bool createEmptyDirectories)        {            return CreateZip(zipFileName, sourceDirectory, recurse, fileFilter, directoryFilter, createEmptyDirectories,                             true, true);        }        public static bool CreateZip(string zipFileName, string sourceDirectory, bool recurse, string fileFilter,                                     string directoryFilter)        {            return CreateZip(zipFileName, sourceDirectory, recurse, fileFilter, directoryFilter, true);        }        public static bool CreateZip(string zipFileName, string sourceDirectory, bool recurse, string fileFilter)        {            return CreateZip(zipFileName, sourceDirectory, recurse, fileFilter, string.Empty);        }        public static bool CreateZip(string zipFileName, string sourceDirectory, bool recurse)        {            return CreateZip(zipFileName, sourceDirectory, recurse, string.Empty);        }        public static bool CreateZip(string zipFileName, string sourceDirectory)        {            return CreateZip(zipFileName, sourceDirectory, true);        }        #endregion        #region ExtractZip        public static bool ExtractZip(string zipFileName, string targetDirectory, FastZip.Overwrite overwrite,                                      FastZip.ConfirmOverwriteDelegate confirmDelegate, string fileFilter,                                      string directoryFilter, bool restoreDateTime, bool createEmptyDirectories,                                      bool restoreAttributesOnExtract, bool restoreDateTimeOnExtract)        {            try            {                FastZip fastZip = new FastZip();                fastZip.CreateEmptyDirectories = createEmptyDirectories;                fastZip.RestoreAttributesOnExtract = restoreAttributesOnExtract;                fastZip.RestoreDateTimeOnExtract = restoreDateTimeOnExtract;                fastZip.ExtractZip(zipFileName, targetDirectory, overwrite, confirmDelegate, fileFilter, directoryFilter,                                   restoreDateTime);                return true;            }            catch (Exception ex)            {                return false;            }        }        public static bool ExtractZip(string zipFileName, string targetDirectory, FastZip.Overwrite overwrite,                                      FastZip.ConfirmOverwriteDelegate confirmDelegate, string fileFilter,                                      string directoryFilter, bool restoreDateTime, bool createEmptyDirectories)        {            return ExtractZip(zipFileName, targetDirectory, overwrite, confirmDelegate, fileFilter, directoryFilter,                              restoreDateTime, createEmptyDirectories, true, true);        }        public static bool ExtractZip(string zipFileName, string targetDirectory, FastZip.Overwrite overwrite,                                      FastZip.ConfirmOverwriteDelegate confirmDelegate, string fileFilter,                                      string directoryFilter, bool restoreDateTime)        {            return ExtractZip(zipFileName, targetDirectory, overwrite, confirmDelegate, fileFilter, directoryFilter,                              restoreDateTime, true);        }        public static bool ExtractZip(string zipFileName, string targetDirectory, FastZip.Overwrite overwrite,                                      FastZip.ConfirmOverwriteDelegate confirmDelegate, string fileFilter,                                      string directoryFilter)        {            return ExtractZip(zipFileName, targetDirectory, overwrite, confirmDelegate, fileFilter, directoryFilter,                              true);        }        public static bool ExtractZip(string zipFileName, string targetDirectory, FastZip.Overwrite overwrite,                                      FastZip.ConfirmOverwriteDelegate confirmDelegate, string fileFilter)        {            return ExtractZip(zipFileName, targetDirectory, overwrite, confirmDelegate, fileFilter, string.Empty);        }        public static bool ExtractZip(string zipFileName, string targetDirectory)        {            return ExtractZip(zipFileName, targetDirectory, string.Empty);        }        public static bool ExtractZip(string zipFileName, string targetDirectory, string fileFilter)        {            return ExtractZip(zipFileName, targetDirectory, FastZip.Overwrite.Always, null, fileFilter);        }        #endregion    }}

  

2、自己实现:

using System;using System.Collections.Generic;using System.IO;using ICSharpCode.SharpZipLib.Zip;namespace Zip{    public static class ZipHelper    {        public static string[] GetDirectories(string sourceDirectory)        {            List
result = new List
(); string[] directories = Directory.GetDirectories(sourceDirectory); if (directories.Length > 0) { foreach (var directory in directories) { result.Add(directory); result.AddRange(GetDirectories(directory)); } } return result.ToArray(); } public static string[] GetFiles(string sourceDirectory) { List
result = new List
(); result.AddRange(Directory.GetFiles(sourceDirectory)); string[] directories = Directory.GetDirectories(sourceDirectory); if (directories.Length > 0) { foreach (var directory in directories) { result.AddRange(GetFiles(directory)); } } return result.ToArray(); } #region CreateZipFile public static void CreateZip(string sourceDirectory) { CreateZip(sourceDirectory, null); } public static void CreateZip(string sourceDirectory, string zipFileName) { if (string.IsNullOrEmpty(sourceDirectory)) { throw new ArgumentNullException("sourceDirectory", "sourceDirectory can not be null or empty."); } if (!Directory.Exists(sourceDirectory)) { throw new DirectoryNotFoundException(sourceDirectory + " can not be found."); } if (string.IsNullOrEmpty(zipFileName)) { zipFileName = sourceDirectory.TrimEnd('\\').TrimEnd('/') + ".zip"; } // Depending on the directory this could be very large and would require more attention // in a commercial package. //string[] filenames = Directory.GetFiles(sourceDirectory); string[] directories = GetDirectories(sourceDirectory); string[] filenames = GetFiles(sourceDirectory); if (!Directory.Exists(Path.GetDirectoryName(zipFileName))) { Directory.CreateDirectory(Path.GetDirectoryName(zipFileName)); } // 'using' statements guarantee the stream is closed properly which is a big source // of problems otherwise. Its exception safe as well which is great. using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFileName))) { s.SetLevel(9); // 0 - store only to 9 - means best compression ZipEntryFactory factory = new ZipEntryFactory(); foreach (var directory in directories) { string virtualDirectory = directory.Replace(sourceDirectory, string.Empty); ZipEntry zipEntry = factory.MakeDirectoryEntry(virtualDirectory); zipEntry.DateTime = DateTime.Now; s.PutNextEntry(zipEntry); } byte[] buffer = new byte[4096]; foreach (string file in filenames) { // Using GetFileName makes the result compatible with XP // as the resulting path is not absolute. string newfileName = file.Replace(sourceDirectory, string.Empty); ZipEntry entry = factory.MakeFileEntry(newfileName); // Setup the entry data as required. // Crc and size are handled by the library for seakable streams // so no need to do them here. // Could also use the last write time or similar for the file. entry.DateTime = DateTime.Now; s.PutNextEntry(entry); using (FileStream fs = File.OpenRead(file)) { // Using a fixed size buffer here makes no noticeable difference for output // but keeps a lid on memory usage. int sourceBytes; do { sourceBytes = fs.Read(buffer, 0, buffer.Length); s.Write(buffer, 0, sourceBytes); } while (sourceBytes > 0); } } // Finish/Close arent needed strictly as the using statement does this automatically // Finish is important to ensure trailing information for a Zip file is appended. Without this // the created file would be invalid. s.Finish(); // Close is important to wrap things up and unlock the file. s.Close(); } } #endregion #region ExtractZip public static void ExtractZip(string zipFileName) { ExtractZip(zipFileName, null); } public static void ExtractZip(string zipFileName, string targetDirectory) { if (string.IsNullOrEmpty(zipFileName)) { throw new ArgumentNullException("zipFileName", "zipFileName can not be null or empty."); } if (!File.Exists(zipFileName)) { throw new FileNotFoundException(zipFileName + " can not be found."); } if (string.IsNullOrEmpty(targetDirectory)) { targetDirectory = Path.Combine(Path.GetDirectoryName(zipFileName), Path.GetFileNameWithoutExtension(zipFileName)); } using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFileName))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { //create directory string targetPath = Path.Combine(targetDirectory, theEntry.Name); if (theEntry.IsDirectory) { Directory.CreateDirectory(targetPath); } if (theEntry.IsFile) { if (!Directory.Exists(Path.GetDirectoryName(targetPath))) { Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); } using (FileStream streamWriter = File.Create(targetPath)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } } } } } } #endregion }}

  

 

转载于:https://www.cnblogs.com/wych/p/3369719.html

你可能感兴趣的文章
webview页面随设备分辨率缩放
查看>>
调侃面向对象编程的23种设计模式
查看>>
8-pandas聚合运算
查看>>
【绿色系统】如何恢复XP“显示桌面”按钮
查看>>
在ubuntu 11.10 下安装谷歌输入法
查看>>
Apache Hive2.1.0安装笔记
查看>>
django中翻译处理国际化方法
查看>>
三:JVM学习-内存分配以及回收策略
查看>>
spring redis 配置子域名共享session (有点坑)
查看>>
Linux 条件变量 pthread_cond_signal及pthread_cond_wait
查看>>
比AtomicInteger更高效的并发计数器LongAdder
查看>>
做一个座右铭工具每天激励自己
查看>>
Jenkins安装配置
查看>>
vmware12下对虚拟机ubuntu14.10系统所在分区sda1进行磁盘扩容
查看>>
EJB到底是什么,真的那么神秘吗??
查看>>
UI开发工具
查看>>
广义表 (五)
查看>>
Swift中NSTimer定时器的使用
查看>>
Forms开发中触发器的执行顺序
查看>>
SEO博客三个月没更新排行骤步康复
查看>>