使用国外开源加压解压库
ICSharpCode.SharpZipLib实现加压,该库的官方网站为http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx使用体验:可以照着例子实现简单的加压解压,可以加压一个文件夹中的所有文件,但没有提供加压子文件夹的说明。 目前网上的一些代码有的无法加压空文件夹,有的加压了用rar解不开,这是一点需要改进的。 但如果只需要加压文件夹第一级子目录中的“文件”(不包括文件夹和子目录)的情况,使用这个库是很方便的。而且是正常zip格式。 比.Net提供的GZipStream类强在它可以按照标准zip格式加压多个文件,而GZipStream没有提供加压多个文件的方法,需要自己定义, 这样解压也只有使用自己的程序才可以,通用性方面不如SharpZipLib。
#region
加压解压方法
///
<summary>
///
功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略)
///
</summary>
///
<param name="dirPath">
被压缩的文件夹夹路径
</param>
///
<param name="zipFilePath">
生成压缩文件的路径,为空则默认与被压缩文件夹同一级目录,名称为:文件夹名+.zip
</param>
///
<param name="err">
出错信息
</param>
///
<returns>
是否压缩成功
</returns>
public
bool
ZipFile(
string
dirPath,
string
zipFilePath,
out
string
err) { err
=
""
;
if
(dirPath
==
string
.Empty) { err
=
"
要压缩的文件夹不能为空!
"
;
return
false
; }
if
(
!
Directory.Exists(dirPath)) { err
=
"
要压缩的文件夹不存在!
"
;
return
false
; }
//
压缩文件名为空时使用文件夹名+.zip
if
(zipFilePath
==
string
.Empty) {
if
(dirPath.EndsWith(
"
\\
"
)) { dirPath
=
dirPath.Substring(
0
, dirPath.Length
-
1
); } zipFilePath
=
dirPath
+
"
.zip
"
; }
try
{
string
[] filenames
=
Directory.GetFiles(dirPath);
using
(ZipOutputStream s
=
new
ZipOutputStream(File.Create(zipFilePath))) { s.SetLevel(
9
);
byte
[] buffer
=
new
byte
[
4096
];
foreach
(
string
file
in
filenames) { ZipEntry entry
=
new
ZipEntry(Path.GetFileName(file)); entry.DateTime
=
DateTime.Now; s.PutNextEntry(entry);
using
(FileStream fs
=
File.OpenRead(file)) {
int
sourceBytes;
do
{ sourceBytes
=
fs.Read(buffer,
0
, buffer.Length); s.Write(buffer,
0
, sourceBytes); }
while
(sourceBytes
>
0
); } } s.Finish(); s.Close(); } }
catch
(Exception ex) { err
=
ex.Message;
return
false
; }
return
true
; }
///
<summary>
///
功能:解压zip格式的文件。
///
</summary>
///
<param name="zipFilePath">
压缩文件路径
</param>
///
<param name="unZipDir">
解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
</param>
///
<param name="err">
出错信息
</param>
///
<returns>
解压是否成功
</returns>
public
bool
UnZipFile(
string
zipFilePath,
string
unZipDir,
out
string
err) { err
=
""
;
if
(zipFilePath
==
string
.Empty) { err
=
"
压缩文件不能为空!
"
;
return
false
; }
if
(
!
File.Exists(zipFilePath)) { err
=
"
压缩文件不存在!
"
;
return
false
; }
//
解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
if
(unZipDir
==
string
.Empty) unZipDir
=
zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
if
(
!
unZipDir.EndsWith(
"
\\
"
)) unZipDir
+=
"
\\
"
;
if
(
!
Directory.Exists(unZipDir)) Directory.CreateDirectory(unZipDir);
try
{
using
(ZipInputStream s
=
new
ZipInputStream(File.OpenRead(zipFilePath))) { ZipEntry theEntry;
while
((theEntry
=
s.GetNextEntry())
!=
null
) {
string
directoryName
=
Path.GetDirectoryName(theEntry.Name);
string
fileName
=
Path.GetFileName(theEntry.Name);
if
(directoryName.Length
>
0
) { Directory.CreateDirectory(unZipDir
+
directoryName); }
if
(
!
directoryName.EndsWith(
"
\\
"
)) directoryName
+=
"
\\
"
;
if
(fileName
!=
String.Empty) {
using
(FileStream streamWriter
=
File.Create(unZipDir
+
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
; } } } } }
//
while
} }
catch
(Exception ex) { err
=
ex.Message;
return
false
; }
return
true
; }
//
解压结束
#endregion
需要添加对SharpZipLib的引用:
using
ICSharpCode.SharpZipLib.Zip;
转载于:https://www.cnblogs.com/tuyile006/archive/2008/04/25/1170894.html
相关资源:使用SharpZipLib压缩解压缩
转载请注明原文地址: https://win8.8miu.com/read-1486795.html