我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为ZipClass和UnZipClass。
我在做项目的时候需要将文件进行压缩和解压缩,于是就从
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);
}
------------------------------------------------------------------------------------------------------------------
///
<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);
}
示例二:
///
<summary>
///
Zip 压缩文件
///
</summary>
public
class
Zip
public
Zip()
#region
加压方法
///
<summary>
///
功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略)
///
</summary>
///
<param name="dirPath">
被压缩的文件夹夹路径
</param>
///
<param name="zipFilePath">
生成压缩文件的路径,为空则默认与被压缩文件夹同一级目录,名称为:文件夹名+.zip
</param>
///
<param name="err">
出错信息
</param>
///
<returns>
是否压缩成功
</returns>
public
static
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
"
;
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;
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
;
#endregion
#region
解压
///
<summary>
///
功能:解压zip格式的文件。
///
</summary>
///
<param name="zipFilePath">
压缩文件路径
</param>
///
<param name="unZipDir">
解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
</param>
///
<param name="err">
出错信息
</param>
///
<returns>
解压是否成功
</returns>
public
static
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);
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);
break
;
}
//
while
catch
(Exception ex)
err = ex.Message;
return
false
;
return
true
;
}
//
解压结束
#endregion
------------------------------------------------------------------------------------------------------------
C#自带源码:
https://files.cnblogs.com/greatverve/Compress.rar
------------------------------------------------------------------------------------------------------------
System.IO.Compression 命名空间
注意:此命名空间在 .NET Framework 2.0 版中是新增的。
System.IO.Compression 命名空间包含提供基本的流压缩和解压缩服务的类。
(downmoon原作)
类 说明
DeflateStream 提供用于使用 Deflate 算法压缩和解压缩流的方法和属性。
GZipStream 提供用于压缩和解压缩流的方法和属性。
枚举 说明
CompressionMode 指定是否压缩或解压缩基础流。
下面以 GZipStream 为例说明
注意:此类在 .NET Framework 2.0 版中是新增的。
提供用于压缩和解压缩流的方法和属性。
命名空间:System.IO.Compression
程序集:System(在 system.dll 中)
语法
Visual Basic(声明)
Public Class GZipStream
Inherits Stream
Visual Basic(用法)
Dim instance As GZipStream
C#
public class GZipStream : Stream
C++
public ref class GZipStream : public Stream
J#
public class GZipStream extends Stream
JScript
public class GZipStream extends Stream
备注
此 类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法。这种格式包括一个检测数据损坏的循环冗余校验值。GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但它可以扩展以使用其他压缩格式。这种格式可以通过不涉及专利使用权的方式轻松实现。gzip 的格式可以从 RFC 1952“GZIP file format specification 4.3(GZIP 文件格式规范 4.3)GZIP file format specification 4.3(GZIP 文件格式规范 4.3)”中获得。此类不能用于压缩大于 4 GB 的文件。
给继承者的说明 当从 GZipStream 继承时,必须重写下列成员:CanSeek、CanWrite 和 CanRead。
下面提供 一个完整的压缩与解压类(downmoon原作 ):
class
clsZip
{
public
void
CompressFile (
string
sourceFile,
string
destinationFile )
{
//
make sure the source file is there
if
( File.Exists ( sourceFile )
==
false
)
throw
new
FileNotFoundException ( );
//
Create the streams and byte arrays needed
byte
[] buffer
=
null
;
FileStream sourceStream
=
null
;
FileStream destinationStream
=
null
;
GZipStream compressedStream
=
null
;
try
{
//
Read the bytes from the source file into a byte array
sourceStream
=
new
FileStream ( sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read );
//
Read the source stream values into the buffer
buffer
=
new
byte
[sourceStream.Length];
int
checkCounter
=
sourceStream.Read ( buffer,
0
, buffer.Length );
if
( checkCounter
!=
buffer.Length )
{
throw
new
ApplicationException ( );
}
//
Open the FileStream to write to
destinationStream
=
new
FileStream ( destinationFile, FileMode.OpenOrCreate, FileAccess.Write );
//
Create a compression stream pointing to the destiantion stream
compressedStream
=
new
GZipStream ( destinationStream, CompressionMode.Compress,
true
);
//
Now write the compressed data to the destination file
compressedStream.Write ( buffer,
0
, buffer.Length );
}
catch
( ApplicationException ex )
{
MessageBox.Show ( ex.Message,
"
压缩文件时发生错误:
"
, MessageBoxButtons.OK, MessageBoxIcon.Error );
}
finally
{
//
Make sure we allways close all streams
if
( sourceStream
!=
null
)
sourceStream.Close ( );
if
( compressedStream
!=
null
)
compressedStream.Close ( );
if
( destinationStream
!=
null
)
destinationStream.Close ( );
}
}
public
void
DecompressFile (
string
sourceFile,
string
destinationFile )
{
//
make sure the source file is there
if
( File.Exists ( sourceFile )
==
false
)
throw
new
FileNotFoundException ( );
//
Create the streams and byte arrays needed
FileStream sourceStream
=
null
;
FileStream destinationStream
=
null
;
GZipStream decompressedStream
=
null
;
byte
[] quartetBuffer
=
null
;
try
{
//
Read in the compressed source stream
sourceStream
=
new
FileStream ( sourceFile, FileMode.Open );
//
Create a compression stream pointing to the destiantion stream
decompressedStream
=
new
GZipStream ( sourceStream, CompressionMode.Decompress,
true
);
//
Read the footer to determine the length of the destiantion file
quartetBuffer
=
new
byte
[
4
];
int
position
=
(
int
)sourceStream.Length
-
4
;
sourceStream.Position
=
position;
sourceStream.Read ( quartetBuffer,
0
,
4
);
sourceStream.Position
=
0
;
int
checkLength
=
BitConverter.ToInt32 ( quartetBuffer,
0
);
byte
[] buffer
=
new
byte
[checkLength
+
100
];
int
offset
=
0
;
int
total
=
0
;
//
Read the compressed data into the buffer
while
(
true
)
{
int
bytesRead
=
decompressedStream.Read ( buffer, offset,
100
);
if
( bytesRead
==
0
)
break
;
offset
+=
bytesRead;
total
+=
bytesRead;
}
//
Now write everything to the destination file
destinationStream
=
new
FileStream ( destinationFile, FileMode.Create );
destinationStream.Write ( buffer,
0
, total );
//
and flush everyhting to clean out the buffer
destinationStream.Flush ( );
}
catch
( ApplicationException ex )
{
MessageBox.Show(ex.Message,
"
解压文件时发生错误:
"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
//
Make sure we allways close all streams
if
( sourceStream
!=
null
)
sourceStream.Close ( );
if
( decompressedStream
!=
null
)
decompressedStream.Close ( );
if
( destinationStream
!=
null
)
destinationStream.Close ( );
}
}
}
url:
http://greatverve.cnblogs.com/archive/2011/12/26/csharp-zip.html
我这个博客废弃不用了,今天想寻找外链的时候,突然想到这个博客权重很高。
有需要免费外链的,留言即可,我准备把这个博客变成免费的友情链接站点。