利用SharpZipLib进行文件的压缩和解压缩

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

/**/ ///<summary>
///压缩文件
///</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>
///解压文件
///</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);
}

好了,到此为止,如何压缩和解压缩的类都已经完成了


你可能感兴趣的:(zip)