让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下的演示程序>>
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经常使用这种压缩方式。
Posted by hexun831012 on 2008/9/28 11:53:42
发表评论: |