Zip格式是开源的压缩格式,在.NET4.0下微软只提供了gzip的相关操作类,在.NET4.5之后才直接提供了操作Zip的类。
在4.0之前想要操作Zip只有借鉴第三方的类库,比较著名的是:ShareZipLib。
直接解压与压缩Zip的操作比较简单,这里小猪分享的是在不解压所有文件的情况下只解压Zip包中的文件
情况一:知道Zip包中有某文件且知道在什么地方,解压Zip包中特定文件。
情况二:不知道文件在Zip包中的位置,需求搜索。
先在项目中引用第三方类库
在类代码前面插入对类库的引用:1
2
3
4
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Core;
编写对应的代码: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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
ZipInputStream zis = new ZipInputStream(System.IO.File.Open(integralName, FileMode.Open));
ZipEntry entry = zis.GetNextEntry\(\);
while (entry != null)
{//这里是情况二
#region 搜索 search.png
if (entry.Name.Contains("search.png"))
{
FileStream writer = System.IO.File.Create(this.Request.PhysicalApplicationPath + "/Zips/" + datetime + "search.png");
//解压后的文件
int bufferSize = 1024 * 2; //缓冲区大小
int readCount = 0; //读入缓冲区的实际字节
byte[] buffer = new byte[bufferSize];
readCount = zis.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
writer.Write(buffer, 0, readCount);
readCount = zis.Read(buffer, 0, bufferSize);
}
writer.Close\(\);
writer.Dispose\(\);
}
#endregion
entry = zis.GetNextEntry\(\);
}
zis.Close\(\);
zis.Dispose\(\);
using (FileStream fs = new FileStream(integralName, FileMode.Open, FileAccess.Read))
using (ZipFile zf = new ZipFile(fs))
{
var ze = zf.GetEntry("face.png");//情况一
if (ze == null)
{
}
else
{
#region 指定 face.png
using (var s = zf.GetInputStream(ze))
{
FileStream writer = System.IO.File.Create(this.Request.PhysicalApplicationPath + "/Zips/" + datetime + "face.png"); //解压后的文件
int bufferSize = 1024*2; //缓冲区大小
int readCount = 0; //读入缓冲区的实际字节
byte[] buffer = new byte[bufferSize];
readCount = s.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
writer.Write(buffer, 0, readCount);
readCount = s.Read(buffer, 0, bufferSize);
}
writer.Close\(\);
writer.Dispose\(\);
// do something with ZipInputStream
}
#endregion
}
}