最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享。
这里主要解决文件夹包含文件夹的解压缩问题。
1
)下载SharpZipLib.dll,在http:
//
www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边有好多文件夹,因为不同的版本,我用的FW2.0。
2
)引用SharpZipLib.dll,在项目中点击项目右键
-->
添加引用
-->
浏览,找到要添加的DLL
-->
确认
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.IO;
using
ICSharpCode.SharpZipLib;
using
ICSharpCode.SharpZipLib.Checksums;
using
ICSharpCode.SharpZipLib.Zip;
/*
*
http://www.icsharpcode.net/OpenSource/SharpZipLib/
下载ICSharpCode.SharpZipLib
* 解压缩
* 该程序压缩和解压配合才能使用
* 普通用 Winrar 压缩的文件该解压不能通过
*/
namespace
ZipApplication
{
#region
ZipClass
///
<summary>
///
压缩类
///
</summary>
public
class
ZipClass
{
#region
ZipFileDictory
///
<summary>
///
递归压缩文件夹方法
///
</summary>
///
<param name="FolderToZip"></param>
///
<param name="s"></param>
///
<param name="ParentFolderName"></param>
private
static
bool
ZipFileDictory(
string
FolderToZip, ZipOutputStream s,
string
ParentFolderName)
{
bool
res
=
true
;
string
[] folders, filenames;
ZipEntry entry
=
null
;
FileStream fs
=
null
;
Crc32 crc
=
new
Crc32();
try
{
//
创建当前文件夹
entry
=
new
ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip)
+
"
/
"
));
//
加上 “/” 才会当成是文件夹创建
s.PutNextEntry(entry);
s.Flush();
//
先压缩文件,再递归压缩文件夹
filenames
=
Directory.GetFiles(FolderToZip);
foreach
(
string
file
in
filenames)
{
//
打开压缩文件
fs
=
File.OpenRead(file);
byte
[] buffer
=
new
byte
[fs.Length];
fs.Read(buffer,
0
, buffer.Length);
entry
=
new
ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip)
+
"
/
"
+
Path.GetFileName(file)));
entry.DateTime
=
DateTime.Now;
entry.Size
=
fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc
=
crc.Value;
s.PutNextEntry(entry);
s.Write(buffer,
0
, buffer.Length);
}
}
catch
{
res
=
false
;
}
finally
{
if
(fs
!=
null
)
{
fs.Close();
fs
=
null
;
}
if
(entry
!=
null
)
entry
=
null
;
GC.Collect();
GC.Collect(
1
);
}
folders
=
Directory.GetDirectories(FolderToZip);
foreach
(
string
folder
in
folders)
{
if
(
!
ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))
return
false
;
}
return
res;
}
#endregion
#region
ZipFileDictory
///
<summary>
///
压缩目录
///
</summary>
///
<param name="FolderToZip">
待压缩的文件夹,全路径格式
</param>
///
<param name="ZipedFile">
压缩后的文件名,全路径格式
</param>
///
<returns></returns>
private
static
bool
ZipFileDictory(
string
FolderToZip,
string
ZipedFile,
string
Password)
{
bool
res;
if
(
!
Directory.Exists(FolderToZip))
return
false
;
ZipOutputStream s
=
new
ZipOutputStream(File.Create(ZipedFile));
s.SetLevel(
6
);
if
(
!
string
.IsNullOrEmpty(Password.Trim()))
s.Password
=
Password.Trim();
res
=
ZipFileDictory(FolderToZip, s,
""
);
s.Finish();
s.Close();
return
res;
}
#endregion
#region
ZipFile
///
<summary>
///
压缩文件
///
</summary>
///
<param name="FileToZip">
要进行压缩的文件名
</param>
///
<param name="ZipedFile">
压缩后生成的压缩文件名
</param>
///
<returns></returns>
private
static
bool
ZipFile(
string
FileToZip,
string
ZipedFile,
string
Password)
{
//
如果文件没有找到,则报错
if
(
!
File.Exists(FileToZip))
throw
new
System.IO.FileNotFoundException(
"
指定要压缩的文件:
"
+
FileToZip
+
"
不存在!
"
);
//
FileStream fs = null;
FileStream ZipFile
=
null
;
ZipOutputStream ZipStream
=
null
;
ZipEntry ZipEntry
=
null
;
bool
res
=
true
;
try
{
ZipFile
=
File.OpenRead(FileToZip);
byte
[] buffer
=
new
byte
[ZipFile.Length];
ZipFile.Read(buffer,
0
, buffer.Length);
ZipFile.Close();
ZipFile
=
File.Create(ZipedFile);
ZipStream
=
new
ZipOutputStream(ZipFile);
if
(
!
string
.IsNullOrEmpty(Password.Trim()))
ZipStream.Password
=
Password.Trim();
ZipEntry
=
new
ZipEntry(Path.GetFileName(FileToZip));
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(
6
);
ZipStream.Write(buffer,
0
, buffer.Length);
}
catch
{
res
=
false
;
}
finally
{
if
(ZipEntry
!=
null
)
{
ZipEntry
=
null
;
}
if
(ZipStream
!=
null
)
{
ZipStream.Finish();
ZipStream.Close();
}
if
(ZipFile
!=
null
)
{
ZipFile.Close();
ZipFile
=
null
;
}
GC.Collect();
GC.Collect(
1
);
}
return
res;
}
#endregion
#region
Zip
///
<summary>
///
压缩文件 和 文件夹
///
</summary>
///
<param name="FileToZip">
待压缩的文件或文件夹,全路径格式
</param>
///
<param name="ZipedFile">
压缩后生成的压缩文件名,全路径格式
</param>
///
<param name="Password">
压缩密码
</param>
///
<returns></returns>
public
static
bool
Zip(
string
FileToZip,
string
ZipedFile,
string
Password)
{
if
(Directory.Exists(FileToZip))
{
return
ZipFileDictory(FileToZip, ZipedFile, Password);
}
else
if
(File.Exists(FileToZip))
{
return
ZipFile(FileToZip, ZipedFile, Password);
}
else
{
return
false
;
}
}
///
<summary>
///
压缩文件 和 文件夹
///
</summary>
///
<param name="FileToZip">
待压缩的文件或文件夹,全路径格式
</param>
///
<param name="ZipedFile">
压缩后生成的压缩文件名,全路径格式
</param>
///
<returns></returns>
public
static
bool
Zip(
string
FileToZip,
string
ZipedFile)
{
return
Zip(FileToZip, ZipedFile,
""
);
}
#endregion
}
#endregion
#region
UnZipClass
///
<summary>
///
解压类
///
</summary>
public
class
UnZipClass
{
#region
UnZip
///
<summary>
///
解压功能(解压压缩文件到指定目录)
///
</summary>
///
<param name="FileToUpZip">
待解压的文件
</param>
///
<param name="ZipedFolder">
指定解压目标目录
</param>
///
<param name="Password">
指定解压密码
</param>
public
static
void
UnZip(
string
FileToUpZip,
string
ZipedFolder,
string
Password)
{
if
(
!
File.Exists(FileToUpZip))
return
;
if
(
!
Directory.Exists(ZipedFolder))
Directory.CreateDirectory(ZipedFolder);
using
(ZipInputStream s
=
new
ZipInputStream(File.OpenRead(FileToUpZip)))
{
if
(
!
string
.IsNullOrEmpty(Password.Trim()))
s.Password
=
Password.Trim();
ZipEntry theEntry;
int
size
=
2048
;
long
fszie;
int
byteLenght;
while
((theEntry
=
s.GetNextEntry())
!=
null
)
{
System.Windows.Forms.MessageBox.Show(s.Length.ToString());
//
Console.WriteLine(theEntry.Name);
string
directoryName
=
Path.GetDirectoryName(theEntry.Name);
string
fileName
=
Path.GetFileName(theEntry.Name);
//
create directory
if
(directoryName.Length
>
0
)
{
Directory.CreateDirectory(directoryName);
}
if
(fileName
!=
String.Empty)
{
fszie
=
theEntry.Size;
using
(FileStream streamWriter
=
File.Create(theEntry.Name))
{
while
(fszie
>
0
)
{
if
(fszie
>
(
long
)size)
byteLenght
=
size;
else
byteLenght
=
Convert.ToInt32(fszie);
fszie
=
fszie
-
size;
byte
[] data
=
new
byte
[byteLenght];
s.Read(data,
0
, byteLenght);
streamWriter.Write(data,
0
, byteLenght);
}
}
}
}
}
//
ZipInputStream s = null;
//
ZipEntry theEntry = null;
//
string fileName;
//
FileStream streamWriter = null;
//
try
//
{
//
s = new ZipInputStream(File.OpenRead(FileToUpZip));
//
if (!string.IsNullOrEmpty(Password.Trim()))
//
s.Password = Password.Trim();
//
int size = 2048;
//
long fszie;
//
int byteLenght;
//
while ((theEntry = s.GetNextEntry()) != null)
//
{
//
fileName = Path.Combine(ZipedFolder, theEntry.Name);
//
//
/判断文件路径是否是文件夹
//
if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
//
{
//
Directory.CreateDirectory(fileName);
//
continue;
//
}
//
streamWriter = File.Create(fileName);
//
fszie = theEntry.Size;
//
if (fszie > 0)
//
{
//
while (fszie > 0)
//
{
//
if (fszie > (long)size)
//
byteLenght = size;
//
else
//
byteLenght = Convert.ToInt32(fszie);
//
fszie = fszie - size;
//
byte[] data = new byte[byteLenght];
//
s.Read(data, 0, byteLenght);
//
streamWriter.Write(data, 0, byteLenght);
//
}
//
}
//
}
//
}
//
finally
//
{
//
if (streamWriter != null)
//
{
//
streamWriter.Close();
//
streamWriter = null;
//
}
//
if (theEntry != null)
//
theEntry = null;
//
if (s != null)
//
{
//
s.Close();
//
s = null;
//
}
//
GC.Collect();
//
GC.Collect(1);
//
}
}
///
<summary>
///
解压功能(解压压缩文件到指定目录)
///
</summary>
///
<param name="FileToUpZip">
待解压的文件
</param>
///
<param name="ZipedFolder">
指定解压目标目录
</param>
public
static
void
UnZip(
string
FileToUpZip,
string
ZipedFolder)
{
UnZip(FileToUpZip, ZipedFolder,
""
);
}
#endregion
}
#endregion
}