Silverlight除了从资源文件加载文件进行UnZip之外,并不支持开放的Zip和UnZip操作。如果需要进行Zip和UnZip操作需要使用第三方库SharpZipLib,其提供了sl的版本,目前支持sl 3.0及其以上的sl。可参见:http://slsharpziplib.codeplex.com/releases/view/50561,以下是pmias中用到的一段代码,贴此以作备用。没有zip操作,只有unzip,参数中的zipStream来自HttpWebResponse response的response.GetResponseStream(),应用形式为直接解压通过HttpResponse返回的Stream,然后保存为文件。如果需要unzip文件可自行修改或查阅SharpZipLib的相关操作,在传参时传入zip文件的Stream即可。
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using System.Text;
namespace Navi
{
/*
* 钟磊 20111107
*
* silverlight 中的 zip 操作
* 其中用到第三方库:SharpZipLib.Silverlight 0.86.0.518,支持silverlight 3以上版本
* 使用时引用库文件 SharpZipLib.Silverlight3.dll
* http://slsharpziplib.codeplex.com/releases/view/50561
*
* 注:所有传入的Stream都不在此类中关闭
* 关闭权留给调用者
*/
public class ZipUtil
{
//将zip过的stream解压后写入文件
public static void ZipStream2File(Stream saveStream, Stream zipStream)
{
ZipInputStream unZipStream = new ZipInputStream(zipStream);
//默认只有一个Entry
ZipEntry theEntry = unZipStream.GetNextEntry();
int size = 1024;
byte[] newbyte = new byte[size];
while (true)
{
size = unZipStream.Read(newbyte, 0, newbyte.Length);
if (size > 0)
{
saveStream.Write(newbyte, 0, size);
}
else
{
break;
}
}
//saveStream.Close();
unZipStream.Close();
//zipStream.Close();
}
//将Stream直接写入文件
public static void Stream2File(Stream saveStream, Stream responseStream)
{
int size = 1024;
byte[] newbyte = new byte[size];
while (true)
{
size = responseStream.Read(newbyte, 0, newbyte.Length);
if (size > 0)
{
//写入数据
saveStream.Write(newbyte, 0, size);
}
else
{
break;
}
}
//responseStream.Close();
//saveStream.Close();
}
//从一个zip格式的stream中unzip出字符串
public static string ZipStream2String(Stream zipStream)
{
ZipInputStream unZipStream = new ZipInputStream(zipStream);
//打开zip文档中的一个Entry,此句必须要有
ZipEntry theEntry = unZipStream.GetNextEntry();
int size = 1024;
byte[] newbyte = new byte[size];
StringBuilder sb = new StringBuilder();
String strTmp;
while (true)
{
size = unZipStream.Read(newbyte, 0, newbyte.Length);
if (size > 0)
{
strTmp = Encoding.UTF8.GetString(newbyte, 0, size);
sb.Append(strTmp);
}
else
{
break;
}
}
unZipStream.Close();
//zipStream.Close();
return sb.ToString();
}
//从Stream中读取字符串
public static string Stream2String(Stream responseStream)
{
StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8);
string result = readStream.ReadToEnd();
readStream.Close();
//responseStream.Close();
return result;
}
}
}