java sharpziplib_C# 使用SharpZipLib生成压缩包的实例代码

本文通过一个简单的小例子简述SharpZipLib压缩文件的常规用法,仅供学习分享使用,如有不足之处,还请指正。

什么是SharpZipLib ?

SharpZipLib是一个C#的类库,主要用来解压缩Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式实现,可以方便的应用于其他的项目之中。

在工程中引用SharpZipLib

在项目中,点击项目名称右键-->管理NuGet程序包,打开NuGet包管理器窗口,进行搜索下载即可,如下图所示:

acb78bf0f62216c34aa40fa449d7c90a.png

SharpZipLib的关键类结构图

如下所示:

6fe98bf574e798deeb17dc2ca9859751.png

涉及知识点:

•ZipOutputStream 压缩输出流,将文件一个接一个的写入压缩文档,此类不是线程安全的。

•PutNextEntry 开始一个新的ZIP条目,ZipOutputStream中的方法。

•ZipEntry 一个ZIP文件中的条目,可以理解为压缩包里面的一个文件夹/文件。

•ZipInputStream 解压缩输出流,从压缩包中一个接一个的读出文档。

•GetNextEntry 读出ZIP条目,ZipInputStream中的方法。

示例效果图:

关于解压缩小例子的示例效果图,如下:

060091fd6d9e1100f3c98460ecf3216f.png

核心代码

using ICSharpCode.SharpZipLib.Checksum;

using ICSharpCode.SharpZipLib.Zip;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace DemoZip

{

class ZipHelper

{

private string rootPath = string.Empty;

#region 压缩

///

/// 递归压缩文件夹的内部方法

///

/// 要压缩的文件夹路径

/// 压缩输出流

/// 此文件夹的上级文件夹

///

private bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName)

{

bool result = true;

string[] folders, files;

ZipEntry ent = null;

FileStream fs = null;

Crc32 crc = new Crc32();

try

{

string entName = folderToZip.Replace(this.rootPath, string.Empty)+"/";

//Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/")

ent = new ZipEntry(entName);

zipStream.PutNextEntry(ent);

zipStream.Flush();

files = Directory.GetFiles(folderToZip);

foreach (string file in files)

{

fs = File.OpenRead(file);

byte[] buffer = new byte[fs.Length];

fs.Read(buffer, 0, buffer.Length);

ent = new ZipEntry(entName + Path.GetFileName(file));

ent.DateTime = DateTime.Now;

ent.Size = fs.Length;

fs.Close();

crc.Reset();

crc.Update(buffer);

ent.Crc = crc.Value;

zipStream.PutNextEntry(ent);

zipStream.Write(buffer, 0, buffer.Length);

}

}

catch

{

result = false;

}

finally

{

if (fs != null)

{

fs.Close();

fs.Dispose();

}

if (ent != null)

{

ent = null;

}

GC.Collect();

GC.Collect(1);

}

folders = Directory.GetDirectories(folderToZip);

foreach (string folder in folders)

if (!ZipDirectory(folder, zipStream, folderToZip))

return false;

return result;

}

///

/// 压缩文件夹

///

/// 要压缩的文件夹路径

/// 压缩文件完整路径

/// 密码

/// 是否压缩成功

public bool ZipDirectory(string folderToZip, string zipedFile, string password)

{

bool result = false;

if (!Directory.Exists(folderToZip))

return result;

ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));

zipStream.SetLevel(6);

if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

result = ZipDirectory(folderToZip, zipStream, "");

zipStream.Finish();

zipStream.Close();

return result;

}

///

/// 压缩文件夹

///

/// 要压缩的文件夹路径

/// 压缩文件完整路径

/// 是否压缩成功

public bool ZipDirectory(string folderToZip, string zipedFile)

{

bool result = ZipDirectory(folderToZip, zipedFile, null);

return result;

}

///

/// 压缩文件

///

/// 要压缩的文件全名

/// 压缩后的文件名

/// 密码

/// 压缩结果

public bool ZipFile(string fileToZip, string zipedFile, string password)

{

bool result = true;

ZipOutputStream zipStream = null;

FileStream fs = null;

ZipEntry ent = null;

if (!File.Exists(fileToZip))

return false;

try

{

fs = File.OpenRead(fileToZip);

byte[] buffer = new byte[fs.Length];

fs.Read(buffer, 0, buffer.Length);

fs.Close();

fs = File.Create(zipedFile);

zipStream = new ZipOutputStream(fs);

if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

ent = new ZipEntry(Path.GetFileName(fileToZip));

zipStream.PutNextEntry(ent);

zipStream.SetLevel(6);

zipStream.Write(buffer, 0, buffer.Length);

}

catch

{

result = false;

}

finally

{

if (zipStream != null)

{

zipStream.Finish();

zipStream.Close();

}

if (ent != null)

{

ent = null;

}

if (fs != null)

{

fs.Close();

fs.Dispose();

}

}

GC.Collect();

GC.Collect(1);

return result;

}

///

/// 压缩文件

///

/// 要压缩的文件全名

/// 压缩后的文件名

/// 压缩结果

public bool ZipFile(string fileToZip, string zipedFile)

{

bool result = ZipFile(fileToZip, zipedFile, null);

return result;

}

///

/// 压缩文件或文件夹

///

/// 要压缩的路径

/// 压缩后的文件名

/// 密码

/// 压缩结果

public bool Zip(string fileToZip, string zipedFile, string password)

{

bool result = false;

if (Directory.Exists(fileToZip))

{

this.rootPath = Path.GetDirectoryName(fileToZip);

result = ZipDirectory(fileToZip, zipedFile, password);

}

else if (File.Exists(fileToZip))

{

this.rootPath = Path.GetDirectoryName(fileToZip);

result = ZipFile(fileToZip, zipedFile, password);

}

return result;

}

///

/// 压缩文件或文件夹

///

/// 要压缩的路径

/// 压缩后的文件名

/// 压缩结果

public bool Zip(string fileToZip, string zipedFile)

{

bool result = Zip(fileToZip, zipedFile, null);

return result;

}

#endregion

#region 解压

///

/// 解压功能(解压压缩文件到指定目录)

///

/// 待解压的文件

/// 指定解压目标目录

/// 密码

/// 解压结果

public bool UnZip(string fileToUnZip, string zipedFolder, string password)

{

bool result = true;

FileStream fs = null;

ZipInputStream zipStream = null;

ZipEntry ent = null;

string fileName;

if (!File.Exists(fileToUnZip))

return false;

if (!Directory.Exists(zipedFolder))

Directory.CreateDirectory(zipedFolder);

try

{

zipStream = new ZipInputStream(File.OpenRead(fileToUnZip));

if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

while ((ent = zipStream.GetNextEntry()) != null)

{

if (!string.IsNullOrEmpty(ent.Name))

{

fileName = Path.Combine(zipedFolder, ent.Name);

fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi

if (fileName.EndsWith("\\"))

{

Directory.CreateDirectory(fileName);

continue;

}

fs = File.Create(fileName);

int size = 2048;

byte[] data = new byte[size];

while (true)

{

size = zipStream.Read(data, 0, data.Length);

if (size > 0)

fs.Write(data, 0, data.Length);

else

break;

}

}

}

}

catch

{

result = false;

}

finally

{

if (fs != null)

{

fs.Close();

fs.Dispose();

}

if (zipStream != null)

{

zipStream.Close();

zipStream.Dispose();

}

if (ent != null)

{

ent = null;

}

GC.Collect();

GC.Collect(1);

}

return result;

}

///

/// 解压功能(解压压缩文件到指定目录)

///

/// 待解压的文件

/// 指定解压目标目录

/// 解压结果

public bool UnZip(string fileToUnZip, string zipedFolder)

{

bool result = UnZip(fileToUnZip, zipedFolder, null);

return result;

}

#endregion

}

}

备注

关于生成压缩的方法还有很多,如通过命令行调用winrar的执行文件,SharpZipLib只是方法之一。

关于SharpZipLib的的API文档,可参看链接。

总结

以上所述是小编给大家介绍的C# 使用SharpZipLib生成压缩包的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值