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

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

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

///<summary>
///压缩文件
///</summary>

usingSystem;
usingSystem.IO;

usingICSharpCode.SharpZipLib.Checksums;
usingICSharpCode.SharpZipLib.Zip;
usingICSharpCode.SharpZipLib.GZip;

namespaceCompression
{
publicclassZipClass
{

publicvoidZipFile(stringFileToZip,stringZipedFile,intCompressionLevel,intBlockSize)
{
//如果文件没有找到,则报错
if(!System.IO.File.Exists(FileToZip))
{
thrownewSystem.IO.FileNotFoundException("Thespecifiedfile"+FileToZip+"couldnotbefound.Zippingaborderd");
}

System.IO.FileStreamStreamToZip=newSystem.IO.FileStream(FileToZip,System.IO.FileMode.Open,System.IO.FileAccess.Read);
System.IO.FileStreamZipFile=System.IO.File.Create(ZipedFile);
ZipOutputStreamZipStream=newZipOutputStream(ZipFile);
ZipEntryZipEntry=newZipEntry("ZippedFile");
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[]buffer=newbyte[BlockSize];
System.Int32size=StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,size);
try
{
while(size<StreamToZip.Length)
{
intsizeRead=StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,sizeRead);
size+=sizeRead;
}
}
catch(System.Exceptionex)
{
throwex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}

publicvoidZipFileMain(string[]args)
{
string[]filenames=Directory.GetFiles(args[0]);

Crc32crc=newCrc32();
ZipOutputStreams=newZipOutputStream(File.Create(args[1]));

s.SetLevel(6);//0-storeonlyto9-meansbestcompression

foreach(stringfileinfilenames)
{
//打开压缩文件
FileStreamfs=File.OpenRead(file);

byte[]buffer=newbyte[fs.Length];
fs.Read(buffer,0,buffer.Length);
ZipEntryentry=newZipEntry(file);

entry.DateTime=DateTime.Now;

//setSizeandthecrc,becausetheinformation
//aboutthesizeandcrcshouldbestoredintheheader
//ifitisnotsetitisautomaticallywritteninthefooter.
//(inthiscasesize==crc==-1intheheader)
//SomeZIPprogramshaveproblemswithzipfilesthatdon'tstore
//thesizeandcrcintheheader.
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();
}
}
}

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

///<summary>
///解压文件
///</summary>

usingSystem;
usingSystem.Text;
usingSystem.Collections;
usingSystem.IO;
usingSystem.Diagnostics;
usingSystem.Runtime.Serialization.Formatters.Binary;
usingSystem.Data;

usingICSharpCode.SharpZipLib.BZip2;
usingICSharpCode.SharpZipLib.Zip;
usingICSharpCode.SharpZipLib.Zip.Compression;
usingICSharpCode.SharpZipLib.Zip.Compression.Streams;
usingICSharpCode.SharpZipLib.GZip;

namespaceDeCompression
{
publicclassUnZipClass
{
publicvoidUnZip(string[]args)
{
ZipInputStreams=newZipInputStream(File.OpenRead(args[0]));

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

stringdirectoryName=Path.GetDirectoryName(args[1]);
stringfileName=Path.GetFileName(theEntry.Name);

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

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

intsize=2048;
byte[]data=newbyte[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,接着往下看如何在窗体里调用。

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

///<summary>
///调用源码
///</summary>

privatevoidbutton2_Click_1(objectsender,System.EventArgse)
{
string[]FileProperties=newstring[2];
FileProperties[0]="C://unzipped//";//待压缩文件目录
FileProperties[1]="C://zip//a.zip";//压缩后的目标文件
ZipClassZc=newZipClass();
Zc.ZipFileMain(FileProperties);
}

privatevoidbutton2_Click(objectsender,System.EventArgse)
{
string[]FileProperties=newstring[2];
FileProperties[0]="C://zip//test.zip";//待解压的文件
FileProperties[1]="C://unzipped//";//解压后放置的目标目录
UnZipClassUnZc=newUnZipClass();
UnZc.UnZip(FileProperties);
}

你可能感兴趣的:(zip)