首先要引用一下类库:using ionic.zip;这个类库可以到网上下载。
下面对类库使用的封装方法:
得到指定的输入流的zip压缩流对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/// < summary >
/// 得到指定的输入流的zip压缩流对象【原有流对象不会改变】
/// </ summary >
/// < param name = "sourcestream" ></ param >
/// < returns ></ returns >
public static stream zipcompress(stream sourcestream, string entryname = "zip")
{
memorystream compressedstream = new memorystream();
if (sourcestream != null)
{
long sourceoldposition = 0;
try
{
sourceoldposition = sourcestream.position;
sourcestream.position = 0;
using (zipfile zip = new zipfile())
{
zip.addentry(entryname, sourcestream);
zip.save(compressedstream);
compressedstream.position = 0;
}
}
catch
{
}
finally
{
try
{
sourcestream.position = sourceoldposition;
}
catch
{
}
}
}
return compressedstream;
}
|
得到指定的字节数组的zip解压流对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/// < summary >
/// 得到指定的字节数组的zip解压流对象
/// 当前方法仅适用于只有一个压缩文件的压缩包,即方法内只取压缩包中的第一个压缩文件
/// </ summary >
/// < param name = "sourcestream" ></ param >
/// < returns ></ returns >
public static stream zipdecompress(byte[] data)
{
stream decompressedstream = new memorystream();
if (data != null)
{
try
{
memorystream datastream = new memorystream(data);
using (zipfile zip = zipfile.read(datastream))
{
if (zip.entries.count > 0)
{
zip.entries.first().extract(decompressedstream);
// extract方法中会操作ms,后续使用时必须先将stream位置归零,否则会导致后续读取不到任何数据
// 返回该stream对象之前进行一次位置归零动作
decompressedstream.position = 0;
}
}
}
catch
{
}
}
return decompressedstream;
}
|
压缩zip文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
/// < summary >
/// 压缩zip文件
/// 支持多文件和多目录,或是多文件和多目录一起压缩
/// </ summary >
/// < param name = "list" >待压缩的文件或目录集合</ param >
/// < param name = "strzipname" >压缩后的文件名</ param >
/// < param name = "isdirstruct" >是否按目录结构压缩</ param >
/// < returns >成功:true/失败:false</ returns >
public static bool compressmulti(list< string > list, string strzipname, bool isdirstruct)
{
try
{
using (zipfile zip = new zipfile(encoding.default))//设置编码,解决压缩文件时中文乱码
{
foreach (string path in list)
{
string filename = path.getfilename(path);//取目录名称
//如果是目录
if (directory.exists(path))
{
if (isdirstruct)//按目录结构压缩
{
zip.adddirectory(path, filename);
}
else//目录下的文件都压缩到zip的根目录
{
zip.adddirectory(path);
}
}
if (file.exists(path))//如果是文件
{
zip.addfile(path,"imges");
}
}
zip.save(strzipname);//压缩
return true;
}
}
catch (exception)
{
return false;
}
}
|
解压zip文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/// < summary >
/// 解压zip文件
/// </ summary >
/// < param name = "strzippath" >待解压的zip文件</ param >
/// < param name = "strunzippath" >解压的目录</ param >
/// < param name = "overwrite" >是否覆盖</ param >
/// < returns >成功:true/失败:false</ returns >
public static bool decompression(string strzippath, string strunzippath, bool overwrite)
{
try
{
readoptions options = new readoptions();
options.encoding = encoding.default;//设置编码,解决解压文件时中文乱码
using (zipfile zip = zipfile.read(strzippath, options))
{
foreach (zipentry entry in zip)
{
if (string.isnullorempty(strunzippath))
{
strunzippath = strzippath.split('.').first();
}
if (overwrite)
{
entry.extract(strunzippath, extractexistingfileaction.overwritesilently);//解压文件,如果已存在就覆盖
}
else
{
entry.extract(strunzippath, extractexistingfileaction.donotoverwrite);//解压文件,如果已存在不覆盖
}
}
return true;
}
}
catch (exception)
{
return false;
}
}
|
以上动图由“图斗罗”提供
这篇c#打包文件解压缩的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/ldyblogs/archive/2017/11/21/package.html