Silverlight 中使用 zip

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章