我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为zipclass和unzipclass。其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享,让首次接触压缩和解压缩的朋友可以少走些弯路。下面就来解释如何在c#里用http://www.icsharpcode.net下载的sharpziplib进行文件的压缩和解压缩。
首先需要在项目里引用sharpziplib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:
/// <summary>
/// 压缩文件
/// </summary>
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();
}
}
}
现在再来看看解压文件类的源码
/// <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
{
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,接着往下看如何在窗体里调用。
首先在窗体里放置两个命令按钮(不要告诉我你不会放啊~),然后编写以下源码
/// <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);
}
好了,到此为止,如何压缩和解压缩的类都已经完成了,需要的朋友直接拿走调吧。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器