随笔 - 15  文章 - 0  评论 - 39  阅读 - 12万

wp7平台zip压缩处理

最近在wp7平台做一个push email 的客户端,通过socket连接接受下来的邮件内容是一个zip压缩包,需要在客户端解压处理。

windows phone 7 没有zip相关的API支持,最后找到一个开源的zip lib包slsharpziplib

地址是:http://slsharpziplib.codeplex.com

解压的代码

复制代码
 1   /// <summary>
2 /// 解压zip包
3 /// </summary>
4 /// <param name="excludeFiles">压缩包中不需要解压处理的文件</param>
5 /// <param name="directoryName">解压到的目标路径</param>
6 /// <param name="sourceFile">待解压的zip包在isolatedStorage中的文件路径</param>
7 /// <returns></returns>
8 public bool UnZip(List<String> excludeFiles, string directoryName, string sourceFile = ReceiveMailDataState.MailDataTempFileName)
9 {
10 bool ret = true;
11 try
12 {
13 IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
14 using (IsolatedStorageFileStream fileStream = file.OpenFile(sourceFile, FileMode.Open, FileAccess.Read))
15 {
16 ZipInputStream s = new ZipInputStream(fileStream);
17 // StreamReader reader = new StreamReader(s);
18 BinaryReader reader = new BinaryReader(s);
19 ZipEntry theEntry;
20 while ((theEntry = s.GetNextEntry()) != null)
21 {
22 string fileName = theEntry.Name;
23 if (fileName != String.Empty)
24 {
25 //如果文件的压缩后大小为0那么说明这个文件是空的,因此不需要进行读出写入
26 if (theEntry.CompressedSize == 0)
27 continue;
28 if (!theEntry.IsFile)
29 continue;
30 else if (!theEntry.IsCompressionMethodSupported())
31 {
32 continue;
33 }
34 else if (!theEntry.CanDecompress)
35 {
36 continue;
37 }
38 if (excludeFiles != null && excludeFiles.Contains(fileName))
39 continue;
40
41 String fullFileName = directoryName + PathSeperater + fileName;
42
43 //Ensure path exist
44 String path = fullFileName.Substring(0, fullFileName.LastIndexOf(PathSeperater));
45 if (!file.DirectoryExists(path))
46 {
47 file.CreateDirectory(path);
48 }
49
50 using (IsolatedStorageFileStream stream = file.CreateFile(fullFileName))
51 {
52 BinaryWriter writer = new BinaryWriter(stream);
53 int size = 2048;
54 byte[] data = new byte[2048];
55 while (true)
56 {
57 size = reader.Read(data, 0, data.Length);
58 if (size > 0) { writer.Write(data, 0, size); }
59 else { break; }
60 }
61 writer.Close();
62 stream.Close();
63 }
64 }
65 }
66 s.Close();
67 }
68 }
69 catch (Exception ex) {
70 Debug.WriteLine(ex.Message);
71 ret = false;
72 }
73 return ret;
74 }
复制代码

解压过程的时候抛出异常

Library cannot extract this entry. Version required is (788).


解决办法:

在slsharpziplib for wp7的源代码中找到ZipEntry类,找到property Version,修改如下,取Version的低字节

public int Version
{
get
{
// Return recorded version if known.
if (_versionToExtract != 0)
{
return _versionToExtract & 0x00ff;
}

至于修改的原因,跟zip格式的结构有关,我将翻译一篇相关资料来解释,敬请期待。

修改完以后重新编译和使用这个包就解压成功了。

在cmd命令行中输入ISETool.exe ts de 23833d6c-1446-4097-a7f6-358c3294d9a3 "C:\Temp"

ISETool命令的用法请看我的文章IsolatedStorage工具使用介绍

把解压后的文件拷贝到C:\Temp目录下,可以看到原来的zip文件解压了

2011/12/02 13:01 <DIR> htmls
2011/12/02 13:01 <DIR> images
2011/12/02 13:01 472 index.xml
2011/12/02 13:01 <DIR> mimes

 

 

xiaobai

devxiaobai@gamil.com

posted on   NN小白  阅读(1817)  评论(5编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2011年12月 >
27 28 29 30 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
1 2 3 4 5 6 7

点击右上角即可分享
微信分享提示