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;
}
}
}