利用SharpZipLib进行文件的压缩和解压缩
系统
2206 0
首先需要在项目里引用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(
"
Thespecifiedfile
"
+
FileToZip
+
"
couldnotbefound.Zippingaborderd
"
);
}
System.IO.FileStreamStreamToZip
=
new
System.IO.FileStream(FileToZip,System.IO.FileMode.Open,System.IO.FileAccess.Read);
System.IO.FileStreamZipFile
=
System.IO.File.Create(ZipedFile);
ZipOutputStreamZipStream
=
new
ZipOutputStream(ZipFile);
ZipEntryZipEntry
=
new
ZipEntry(
"
ZippedFile
"
);
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte
[]buffer
=
new
byte
[BlockSize];
System.Int32size
=
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.Exceptionex)
...
{
throw
ex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}
public
void
ZipFileMain(
string
[]args)
...
{
string
[]filenames
=
Directory.GetFiles(args[
0
]);
Crc32crc
=
new
Crc32();
ZipOutputStreams
=
new
ZipOutputStream(File.Create(args[
1
]));
s.SetLevel(
6
);
//
0-storeonlyto9-meansbestcompression
foreach
(
string
file
in
filenames)
...
{
//
打开压缩文件
FileStreamfs
=
File.OpenRead(file);
byte
[]buffer
=
new
byte
[fs.Length];
fs.Read(buffer,
0
,buffer.Length);
ZipEntryentry
=
new
ZipEntry(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
...
{
public
class
UnZipClass
...
{
public
void
UnZip(
string
[]args)
...
{
ZipInputStreams
=
new
ZipInputStream(File.OpenRead(args[
0
]));
ZipEntrytheEntry;
while
((theEntry
=
s.GetNextEntry())
!=
null
)
...
{
string
directoryName
=
Path.GetDirectoryName(args[
1
]);
string
fileName
=
Path.GetFileName(theEntry.Name);
//
生成解压目录
Directory.CreateDirectory(directoryName);
if
(fileName
!=
String.Empty)
...
{
//
解压文件到指定的目录
FileStreamstreamWriter
=
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);
}
好了,到此为止,如何压缩和解压缩的类都已经完成了
利用SharpZipLib进行文件的压缩和解压缩
更多文章、技术交流、商务合作、联系博主
微信扫码或搜索:z360901061
微信扫一扫加我为好友
QQ号联系: 360901061
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
【本文对您有帮助就好】元