使用ICSharpCode.SharpZipLib.Zip实现压缩与解压缩
使用开源类库ICSharpCode.SharpZipLib.Zip可以实现压缩与解压缩功能,源代码和DLL可以从http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx下载;
有两种方式可以实现压缩与解压缩,这里只提供了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<string> result = new List<string>(); 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<string> result = new List<string>();
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
}
}
使用ICSharpCode.SharpZipLib.Zip实现压缩与解压缩的更多相关文章
- 基于ICSharpCode.SharpZipLib.Zip的压缩解压缩
原文:基于ICSharpCode.SharpZipLib.Zip的压缩解压缩 今天记压缩解压缩的使用,是基于开源项目ICSharpCode.SharpZipLib.Zip的使用. 一.压缩: /// ...
- C#调用 ICSharpCode.SharpZipLib.Zip 实现解压缩功能公用类
最近想用个解压缩功能 从网上找了找 加自己修改,个人感觉还是比较好用的,直接上代码如下 using System; using System.Linq; using System.IO; using ...
- 利用ICSharpCode.SharpZipLib.Zip进行文件压缩
官网http://www.icsharpcode.net/ 支持文件和字符压缩. 创建全新的压缩包 第一步,创建压缩包 using ICSharpCode.SharpZipLib.Zip; ZipOu ...
- C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用
工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...
- C# ZipHelper C#公共类 -- ICSharpCode.SharpZipLib.dll实现压缩和解压
关于本文档的说明 本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的 1.基本介绍 由于项目中需要用到各种压缩将文件 ...
- 使用NPOI读取Excel报错ICSharpCode.SharpZipLib.Zip.ZipException:Wrong Local header signature
写了一个小程序利用NPOI来读取Excel,弹出这样的报错: ICSharpCode.SharpZipLib.Zip.ZipException:Wrong Local header signature ...
- C# 利用ICSharpCode.SharpZipLib.dll 实现压缩和解压缩文件
我们 开发时经常会遇到需要压缩文件的需求,利用C#的开源组件ICSharpCode.SharpZipLib, 就可以很容易的实现压缩和解压缩功能. 压缩文件: /// <summary> ...
- ICSharpCode.SharpZipLib.Zip
//压缩整个目录下载 var projectFolder = Request.Params["folder"] != null ? Request.Params["fol ...
- 利用Java进行zip文件压缩与解压缩
摘自: https://www.cnblogs.com/alphajuns/p/12442315.html 工具类: package com.alphajuns.util; import java.i ...
随机推荐
- 3 - SQL Server 2008 之 使用SQL语句删除约束条件
基本语法为: ALTER TABLE 表名 DROP CONSTRAINT 约束名1,约束名2…… 如果删除一个约束,不需要逗号后的约束名,如果删除两个及两个以上的约束,必须以逗号隔开. 使用上一节中 ...
- 本地代码git到github上
本地代码git到github上 对于个程序员来说,不写自己的博客,没有自己的作品集没有Github就不算好的程序员!咳咳~ 开个玩笑.对于我个人来说,要做个程序员,就要有自己的作品集和技术博客(我说是 ...
- MVVM之View和ViewModel的关联
概要: 将所有的VM在加载到Application的Static Resource中,然后在View中用标签指定. 实现: 1)采用特性指定要添加到StaticResource中的对象 public ...
- 【css面试题】三个DIV要求水平对齐,左右两个DIV宽度固定为100px,中间那个DIV充满剩余的宽度(至少2种方法)
这是我在一家公司面试时遇到的问题,当时没有答上来!! 所以看到的小伙伴一定要注意了!! 变化浏览器宽度可看到效果: 左 右 中 然后我们来看看代码: 第一种方法:(浮动) <style type ...
- MyTask3
近日做这个项目的时候感觉比较棘手的还是各类chart图处理的问题,详细的我就不多说了,代码我会贴出来,大家可以参考下,注释我还是写的比较详细的 1.饼状图百分比绑定问题(纠结了很久) // // ch ...
- .net 学习路线感想
从上到大学到现在工作,已经有六年多了,发现学习编程到以开发为工作也是一个挺长的过程的. 大学中,从c语言到java.C#到其他各种语言的学习,还有其他知识的学习如:数据库(oracle.sql Ser ...
- android EventBus 的使用
今天简单的介绍 一下啊 android EventBus 的使用 EventBus 在官方介绍中是订阅......什么的 一大堆 , 在我android 菜鸟眼里 就是用来代替android 广 ...
- ASP.NET Excel数据导出数据库
/// <summary> /// 根據gridview導出excel /// </summary> /// <param name="ctl"> ...
- javascript基础学习(十)
javascript之数组 学习要点: 数组的介绍 定义数组 数组元素 数组的方法 一.数组的介绍 数组中的元素类型可以是数字型.字符串型.布尔型等,甚至也可以是一个数组. 二.定义数组 1.通过数组 ...
- date日期比较和格式化方法
时间的比较 var now = new Date();//现在时间 var setDate = new Date(2017,0,5,17,55,55);//设定的时间 laert(now < s ...