当前位置: 首页> > 资讯 > 软件教程 > 在C#中利用SharpZipLib进行文件的压缩和解压缩

在C#中利用SharpZipLib进行文件的压缩和解压缩

2024-01-17 01:29:06 58163次 佚名

类型:生活服务
时间: 2024-11-01
标签:娱乐,搜索,体育,电竞,搜索引擎,浏览器,应用商店,手机助手,短信,隐私

我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为ZipClass和UnZipClass。其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享,让首次接触压缩和解压缩的朋友可以少走些弯路。下面就来解释如何在C#里用http://www.icsharpcode.net下载的SharpZipLib进行文件的压缩和解压缩。


首先需要在项目里引用SharpZipLib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:


///


/// 压缩文件
///


using System;
using System.IO;


using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;


namespace Compression
{
public class ZipClass
{

public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize)
{
//如果文件没有找到,则报错
if (! System.IO.File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
}

System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
ZipEntry ZipEntry = new ZipEntry("ZippedFile");
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[] buffer = new byte[BlockSize];
System.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;
}
}
catch(System.Exception ex)
{
throw ex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}

public void ZipFileMain(string[] args)
{
string[] filenames = Directory.GetFiles(args[0]);

Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));

s.SetLevel(6); // 0 - store only to 9 - means best compression

foreach (string file in filenames)
{
//打开压缩文件
FileStream fs = File.OpenRead(file);

byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(file);

entry.DateTime = DateTime.Now;

// set Size and the crc, because the information
// about the size and crc should be stored in the header
// if it is not set it is automatically written in the footer.
// (in this case size == crc == -1 in the header)
// Some ZIP programs have problems with zip files that don't store
// the size and crc in the header.
entry.Size = fs.Length;
fs.Close();

crc.Reset();
crc.Update(buffer);

entry.Crc = crc.Value;

s.PutNextEntry(entry);

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

}

s.Finish();
s.Close();
}
}
}


现在再来看看解压文件类的源码


///


/// 解压文件
///


using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;


using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;


namespace DeCompression
{
public class UnZipClass
{
public void UnZip(string[] args)
{
ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));

ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{

string directoryName = Path.GetDirectoryName(args[1]);
string fileName = Path.GetFileName(theEntry.Name);

//生成解压目录
Directory.CreateDirectory(directoryName);

if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1]+theEntry.Name);

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;
}
}

streamWriter.Close();
}
}
s.Close();
}
}
}


有了压缩和解压缩的类以后,就要在窗体里调用了。怎么?是新手,不会调用?Ok,接着往下看如何在窗体里调用。


首先在窗体里放置两个命令按钮(不要告诉我你不会放啊~),然后编写以下源码


///


/// 调用源码
///


private void button2_Click_1(object sender, System.EventArgs e)
{
string []FileProperties=new string[2];
FileProperties[0]="C:\\unzipped\\";//待压缩文件目录
FileProperties[1]="C:\\zip\\a.zip"; //压缩后的目标文件
ZipClass Zc=new ZipClass();
Zc.ZipFileMain(FileProperties);
}


private void button2_Click(object sender, System.EventArgs e)
{
string []FileProperties=new string[2];
FileProperties[0]="C:\\zip\\test.zip";//待解压的文件
FileProperties[1]="C:\\unzipped\\";//解压后放置的目标目录
UnZipClass UnZc=new UnZipClass();
UnZc.UnZip(FileProperties);
}


好了,到此为止,如何压缩和解压缩的类都已经完成了,需要的朋友直接拿走调吧。


关文章

  • 操作系统常见问题:利用extract解压缩CAB文件
    操作系统常见问题:利用extract解压缩CAB文件

                                                                                                                                  你在 Windows 95 或98的光盘里都会看到 Windows 的源文件都是以.cab 的方式储存着,.cab 文件是 Windows

  • 为Win 2003加装视频压缩
    为Win 2003加装视频压缩

                                                                                                                                  最近刚装了Windows server 2003,觉得挺好用的,但是新的问题就来了,玩CS时开头动画没有图像,只有声音。提示“视频无法使用

  • XP实用技巧:关闭压缩旧文件功能
    XP实用技巧:关闭压缩旧文件功能

                                                                                                                                  如果我们使用NTFS文件系统的话,我们可以通过“磁盘整理”中的“压缩旧文件”功能来节省被那些大量长时间没有使用的文件所占用的硬盘空间(如图

  • 机车 眩高清汽车局部
    机车 眩高清汽车局部

    [1][2][3]

  • 路由器的安全配置
    路由器的安全配置

                                                                                                                                  随着Internet的快速发展和政府、企业上网工程的日益推广,越来越多的政府机关和企业在网络上建立网站来进行对外宣传,这样,网络上的安全问

  • 专题:光盘刻录全接触
    专题:光盘刻录全接触

                                                                                                                                   刻录机,这个几年前的奢侈品,现在已经成了标准配制。硬盘中东西太多,借到一张好盘想留一张,有了刻录机就都迎刃而解了。刻录软件使用简单,一目

  • 服务器端调用winzip命令行对上传的多个文件打包压缩
    服务器端调用winzip命令行对上传的多个文件打包压缩

                                                                                                                                  要解决这个问题,首先要了解一下Windows Scripting Host,简称为WSH!下面引用一下微软给的解释: WSH是微软脚本技术

  • 在C#中利用SharpZipLib进行文件的压缩和解压缩
    在C#中利用SharpZipLib进行文件的压缩和解压缩

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为ZipClass和UnZipClass。其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享,让首

  • 巧改ISO文件 刻录光盘中的隐藏文件自己造
    巧改ISO文件 刻录光盘中的隐藏文件自己造

      在许多正版光盘中,都存在不少隐藏的目录或文件。如果能在刻录光盘时打造自己的隐藏文件,岂不妙哉。那还等什么,赶快跟我来吧!   一、原理篇   ISO 9660 记录规定光盘镜像文件的每一个目录和文件都有一定的格式、规定和记录,其中第26个字节记录的就是文件夹标记项。那么光盘隐藏的原理就是修改ISO文件的第26个字节的位置,让光盘产生文件确实存在,但又看不到文件和目录的特殊效果。   二、操作篇

  • 长虹进军刻录DVD市场 刻录DVD价格有望跳水
    长虹进军刻录DVD市场 刻录DVD价格有望跳水

    南方日报   本报讯 (记者 郎朗) 近日,继万利达发起刻录DVD普及风暴后,长虹也宣布将正式进入刻录DVD市场。与此同时,飞利浦也宣布,今年飞利浦DVD刻录机将会在定价策略上有所改变。一时间,国内刻录DVD市场“山雨欲来”。   据长虹新闻发言人刘海中介绍,长虹刻录DVD已完成在北京、广州、成都等城市的家电大卖场的布局。同时,2000年就将刻录DVD引入中国的飞利浦也在加紧收复失地。新上任的飞利

热门专区推荐