首先需要在项目里引用SharpZipLib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:
///压缩文件
///</summary>
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
namespace Compression
... {
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>
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
... {
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>
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);
}
好了,到此为止,如何压缩和解压缩的类都已经完成了