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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库