让IE也能实现解压缩功能(提供演示源码下载)

2007/1/25 10:29:13


阅读全文(2518) | 回复(1) | 编辑 | 精华

Author:二十四画生 From:Cnblogs 在看dnn时发现了一个很酷的功能:能通过ie浏览器实现对zip文件的压缩和生成zip文件文件压缩包的功能。在仔细看过程序以后发现它是调用的sharpziplib.dll类库中的内容实现的压缩与解压功能。上网查了一下sharpziplib,发现它居然是开源的,在http://www.icsharpcode.net网站上有下。在网站里关于SharpZipLib的源文件和调用演示包括帮助文档都有下,不过当然全是E文的。(真不知在中国有哪家公司在做.net的开源,真的十分想看国产的优秀开源项目) 在sharpziplib中实现解压的方法(演示代码): 500)this.width=500'>using System;500)this.width=500'>using System.Text;500)this.width=500'>using System.Collections;500)this.width=500'>using System.IO;500)this.width=500'>using System.Diagnostics;500)this.width=500'>using System.Runtime.Serialization.Formatters.Binary;500)this.width=500'>using System.Data;500)this.width=500'>500)this.width=500'>using ICSharpCode.SharpZipLib.BZip2;500)this.width=500'>using ICSharpCode.SharpZipLib.Zip;500)this.width=500'>using ICSharpCode.SharpZipLib.Zip.Compression;500)this.width=500'>using ICSharpCode.SharpZipLib.Zip.Compression.Streams;500)this.width=500'>using ICSharpCode.SharpZipLib.GZip;500)this.width=500'>500)this.width=500'>500)this.width=500'>class MainClass500)this.width=500'>500)this.width=500'>500)this.width=500'>{            500)this.width=500'>    // 在控制命令行下输入要解压的Zip文件名500)this.width=500'>    public static void Main(string[] args)500)this.width=500'>500)this.width=500'>    500)this.width=500'>{500)this.width=500'>        // 创建读取Zip文件对象500)this.width=500'>        ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));500)this.width=500'>        // Zip文件中的每一个文件500)this.width=500'>        ZipEntry theEntry;500)this.width=500'>        // 循环读取Zip文件中的每一个文件500)this.width=500'>500)this.width=500'>        while ((theEntry = s.GetNextEntry()) != null) 500)this.width=500'>{500)this.width=500'>            500)this.width=500'>            Console.WriteLine(theEntry.Name);500)this.width=500'>            500)this.width=500'>            string directoryName = Path.GetDirectoryName(theEntry.Name);500)this.width=500'>            string fileName      = Path.GetFileName(theEntry.Name);500)this.width=500'>            500)this.width=500'>            // create directory500)this.width=500'>            Directory.CreateDirectory(directoryName);500)this.width=500'>            500)this.width=500'>500)this.width=500'>            if (fileName != String.Empty) 500)this.width=500'>{500)this.width=500'>                // 解压文件500)this.width=500'>                FileStream streamWriter = File.Create(theEntry.Name);500)this.width=500'>                500)this.width=500'>                int size = 2048;500)this.width=500'>                byte[] data = new byte[2048];500)this.width=500'>500)this.width=500'>                while (true) 500)this.width=500'>{500)this.width=500'>                    // 写入数据500)this.width=500'>                    size = s.Read(data, 0, data.Length);500)this.width=500'>500)this.width=500'>                    if (size > 0) 500)this.width=500'>{500)this.width=500'>                        streamWriter.Write(data, 0, size);500)this.width=500'>500)this.width=500'>                    } else 500)this.width=500'>{500)this.width=500'>                        break;500)this.width=500'>                    }500)this.width=500'>                }500)this.width=500'>                500)this.width=500'>                streamWriter.Close();500)this.width=500'>            }500)this.width=500'>        }500)this.width=500'>        s.Close();500)this.width=500'>    }500)this.width=500'>}500)this.width=500'>在SharpZipLib中实现压缩的方法: 500)this.width=500'>using System;500)this.width=500'>using System.IO;500)this.width=500'>500)this.width=500'>using ICSharpCode.SharpZipLib.Checksums;500)this.width=500'>using ICSharpCode.SharpZipLib.Zip;500)this.width=500'>using ICSharpCode.SharpZipLib.GZip;500)this.width=500'>500)this.width=500'>class MainClass500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'>    // 输入要压缩的文件夹和要创建的Zip文件文件名称500)this.width=500'>    public static void Main(string[] args)500)this.width=500'>500)this.width=500'>    500)this.width=500'>{500)this.width=500'>        string[] filenames = Directory.GetFiles(args[0]);500)this.width=500'>        500)this.width=500'>        Crc32 crc = new Crc32();500)this.width=500'>        // 创建输出Zip文件对象500)this.width=500'>        ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));500)this.width=500'>        // 设置压缩等级500)this.width=500'>        s.SetLevel(6); // 0 - store only to 9 - means best compression500)this.width=500'>        // 循环读取要压缩的文件,写入压缩包        500)this.width=500'>500)this.width=500'>        foreach (string file in filenames) 500)this.width=500'>{500)this.width=500'>            FileStream fs = File.OpenRead(file);500)this.width=500'>            500)this.width=500'>            byte[] buffer = new byte[fs.Length];500)this.width=500'>            fs.Read(buffer, 0, buffer.Length);500)this.width=500'>            ZipEntry entry = new ZipEntry(file);500)this.width=500'>            500)this.width=500'>            entry.DateTime = DateTime.Now;500)this.width=500'>            500)this.width=500'>            entry.Size = fs.Length;500)this.width=500'>            fs.Close();500)this.width=500'>            500)this.width=500'>            crc.Reset();500)this.width=500'>            crc.Update(buffer);500)this.width=500'>            500)this.width=500'>            entry.Crc  = crc.Value;500)this.width=500'>            500)this.width=500'>            s.PutNextEntry(entry);500)this.width=500'>            500)this.width=500'>            s.Write(buffer, 0, buffer.Length);500)this.width=500'>            500)this.width=500'>        }500)this.width=500'>        500)this.width=500'>        s.Finish();500)this.width=500'>        s.Close();500)this.width=500'>    }500)this.width=500'>}  类中应该还有其他功能,还没有来得及看。具体SharpZipLib中是如何实行的也还没有来得及看,先试一试最简单功能,大家有兴趣可以下载看看。默认提供的演示程序是控制台下运行的(好像还有其他环境中运行的,不过我没有试),我照着做了一个WEB应用程序的,希望能对大家有用。下载WEB下的演示程序>>

Qr

Posted by Qr on 2007/1/25 10:29:13

回复:让IE也能实现解压缩功能(提供演示源码下载)

2008/9/28 11:53:42


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

哇哈哈,.NET 2.0本身就支持压缩的。System.IO.Compression是.NET 2.0中的新特性,可以实现标准的GZip压缩,并且大部分浏览器都支持。 using System.IO.Compression;//...Response.AddHeader("Content-Encoding", "gzip");using (GZipStream gzip = new GZipStream(Response.OutputStream, CompressionMode.Compress)){  using (XmlWriter writer = XmlWriter.Create(gzip, settings))  {    //write  }} 以下为blog主人的回复: gz大大减轻了数据传输量,SVG经常使用这种压缩方式。

hexun831012

Posted by hexun831012 on 2008/9/28 11:53:42

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.270 second(s), page refreshed 144768337 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号