Asp.net中文件的压缩与解压

  这里笔者为大家介绍在asp.net中使用文件的压缩与解压。在asp.net中使用压缩给大家带来的好处是显而易见的,首先是减小了服务器端文件存储的空间,其次下载时候下载的是压缩文件想必也会有效果吧,特别是比较大的文件。有的客户可能会很粗心上传的是文件,那么可以通过判断后缀名来判断文件,不是压缩文件,就可以压缩文件,在存储。

  这里笔者引用了一个DLL文件(ICSharpCode.SharpZipLib.dll)(包含在本文代码中),调用其中的函数,就可以对文件进行压缩及解压了。其中压缩笔者主要用到的函数是

1 /// <summary>
2 /// 压缩文件
3 /// </summary>
4 /// <param name="fileName">要压缩的所有文件(完全路径)</param>
5 /// <param name="name">压缩后文件路径</param>
6 /// <param name="Level">压缩级别</param>
7   public void ZipFileMain(string[] filenames, string name, int Level)
8 {
9 ZipOutputStream s = new ZipOutputStream(File.Create(name));
10 Crc32 crc = new Crc32();
11 //压缩级别
12 s.SetLevel(Level); // 0 - store only to 9 - means best compression
13 try
14 {
15 foreach (string file in filenames)
16 {
17 //打开压缩文件
18 FileStream fs = File.OpenRead(file);
19
20 byte[] buffer = new byte[fs.Length];
21 fs.Read(buffer, 0, buffer.Length);
22
23 //建立压缩实体
24 ZipEntry entry = new ZipEntry(System.IO.Path.GetFileName(file));
25
26 //时间
27 entry.DateTime = DateTime.Now;
28
29 // set Size and the crc, because the information
30 // about the size and crc should be stored in the header
31 // if it is not set it is automatically written in the footer.
32 // (in this case size == crc == -1 in the header)
33 // Some ZIP programs have problems with zip files that don't store
34 // the size and crc in the header.
35 //空间大小
36 entry.Size = fs.Length;
37 fs.Close();
38 crc.Reset();
39 crc.Update(buffer);
40 entry.Crc = crc.Value;
41 s.PutNextEntry(entry);
42 s.Write(buffer, 0, buffer.Length);
43 }
44 }
45 catch
46 {
47 throw;
48 }
49 finally
50 {
51 s.Finish();
52 s.Close();
53 }
54
55 }

解压缩的主要代码

1 /// <summary>
2 /// 解压文件
3 /// </summary>
4 /// <param name="ZipPath">被解压的文件路径</param>
5 /// <param name="Path">解压后文件的路径</param>
6 public void UnZip(string ZipPath,string Path)
7 {
8 ZipInputStream s = new ZipInputStream(File.OpenRead(ZipPath));
9
10 ZipEntry theEntry;
11 try
12 {
13 while ((theEntry = s.GetNextEntry()) != null)
14 {
15 string fileName = System.IO.Path.GetFileName(theEntry.Name);
16
17 //生成解压目录
18 Directory.CreateDirectory(Path);
19
20 if (fileName != String.Empty)
21 {
22 //解压文件
23 FileStream streamWriter = File.Create(Path + fileName);
24
25 int size = 2048;
26 byte[] data = new byte[2048];
27 while (true)
28 {
29 size = s.Read(data, 0, data.Length);
30 if (size > 0)
31 {
32 streamWriter.Write(data, 0, size);
33 }
34 else
35 {
36
37 streamWriter.Close();
38 streamWriter.Dispose();
39 break;
40 }
41 }
42
43 streamWriter.Close();
44 streamWriter.Dispose();
45 }
46 }
47 }
48 catch
49 {
50 throw;
51 }
52 finally
53 {
54 s.Close();
55 s.Dispose();
56 }
57 }
58 }

那么我这里做了个简单的测试程序(点击下载

 

这里已知道要被压缩文件,这里只需填入要被压缩到的路径("D:\text\")解压路径一样。这里解压级别越大,压缩的就越厉害。

可以看测试小程序,将解压/压缩引入到你的项目中

好了,如果本文对你有作用请您留个言语,让笔者知道 ^_^



知识是一点一点积累起来的                  --小风

posted @ 2010-09-03 08:27 小风 阅读(2615) 评论(17) 编辑 收藏

 回复 引用 查看   
#1楼 2010-09-03 08:38 jolboy      
问一下,如果用户上传的是1G以内的大文件呢,也去压缩?那不是一边传,服务端一边写文件,弄好后,压缩,然后存储,删除旧的~~
那传一个500M的文件,不是要很久才能搞定

 回复 引用 查看   
#2楼 2010-09-03 08:39 Cocoo      
正好昨天也自己也写了一个,你咋不早点发出来。
 回复 引用 查看   
#3楼[楼主] 2010-09-03 08:42 小风      
@jolboy
我个人想上传1G的文件,除非那人网速很快,或者不懂电脑一般都会自己先压缩在上传。
你自己想想特别是图片,我们压缩后可以节省很多空间。
如果觉得压缩很费时间,那么你就要选择是要时间还是空间了

 回复 引用 查看   
#4楼[楼主] 2010-09-03 08:43 小风      
@Cocoo
一直没有总结。。。

 回复 引用 查看   
#5楼 2010-09-03 08:45 jolboy      
@小风
有道理~这样做,也就不用考虑用户上传的文件是否是真正的图片还是真正的word什么的了~~一律给他打包压缩,也不管他是否打过包了,哈哈~~上传木马上来也就不怕了

 回复 引用 查看   
#6楼 2010-09-03 08:58 bdnet      
@jolboy
有一定的好处,但是图片恐怕不行
难不成显示图片时每次读取解压一次?这挺损耗性能的啊
另外图片的压缩率不会很高,除了BMP

 回复 引用 查看   
#7楼 2010-09-03 09:06 Cocoo      
你的这个解压缩应该有问题,我昨天一开始大概也是在网上搜的这个,但是如果压缩文件内部有子文件夹就报错,原因是没有那个目录。
 回复 引用 查看   
#8楼[楼主] 2010-09-03 09:08 小风      
@Cocoo
这个问题我也遇到过,解决方法有两个一个将文件拿出来放在一个目录下打包。另外方法是先打包里面的在打包外面的

 回复 引用 查看   
#9楼[楼主] 2010-09-03 09:08 小风      
你可以从程序中发现搜索的是文件不是文件夹
 回复 引用 查看   
#10楼 2010-09-03 09:19 微软中国      
这个所有文件放到一个目录里面打包。岂不是乱了。还得解压了再放回去。
先打包里面的。如果套了四五层。我是不是得打几次。楼主还是改良下吧。。期待!

 回复 引用 查看   
#11楼 2010-09-03 09:25 马老虎      
以前也研究过。。
 回复 引用 查看   
#12楼 2010-09-03 09:44 snow365      
引用bdnet:
@jolboy
有一定的好处,但是图片恐怕不行
难不成显示图片时每次读取解压一次?这挺损耗性能的啊
另外图片的压缩率不会很高,除了BMP

+1

 回复 引用 查看   
#13楼 2010-09-03 10:25 ybgenius      
这个好像实用性不是很强
 回复 引用 查看   
#14楼 2010-09-03 11:22 Wuya      
对于常用的图片格式,例如:jpg,png,gif等等,因为已经压缩过了,再次压缩只是浪费时间,几乎没效果。
如果是位图,压缩效果明显。

 回复 引用 查看   
#15楼[楼主] 2010-09-03 11:31 小风      
笔者推荐,你们在实际应用中实验下,看看你想的性能损耗和实际的效果。
 回复 引用 查看   
#16楼 2010-09-03 11:54 Cocoo      
问题我昨天都已经解决了,只是多了些判断。
 回复 引用 查看   
#17楼 2010-09-03 21:25 jewely      
性能第一,空间不是问题