C#中文件压缩及解压操作

新手一枚,这是我的处女作,希望大家觉得不好的地方提出来一起讨论讨论。

首先要用到一个外部组件,大家可以到http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx这里下载

我也找了很多类似的资料,把它们综合了一下,更人性化了些大家拿去直接可以使用。


-------------------------------------------压缩类---------------------------------------------------

 

 1 using System;
 2 using System.IO;
 3 using ICSharpCode.SharpZipLib.Checksums;
 4 using ICSharpCode.SharpZipLib.Zip;
 5 using ICSharpCode.SharpZipLib.GZip;
 6 
 7 namespace ZipFile
 8 {
 9     /// <summary>
10     /// 压缩文件
11     /// </summary>
12     public class ZipHelp
13     {
14         public string ZipName { get; set; }
15         /// <summary>
16         /// 压缩文件夹
17         /// </summary>
18         /// <param name="zipSourcePath">需要压缩的文件夹路径(全路径)</param>
19         /// <param name="zipToFilePath">压缩后保存的路径且必须带后缀名如:D:\\aa.zip(如果为空字符则默认保存到同级文件夹名称为源文件名)</param>
20         public void ZipFileMain(string zipSourcePath,string zipToFilePath)
21         {
22             string[] filenames = Directory.GetFiles(zipSourcePath);
23             ZipName = zipSourcePath.Substring(zipSourcePath.LastIndexOf("\\")+1);
24             //定义压缩更目录对象
25             Crc32 crc = new Crc32();
26             ZipOutputStream s = new ZipOutputStream(File.Create(zipToFilePath.Equals("")? zipSourcePath+".zip":zipToFilePath));
27 
28             s.SetLevel(6); // 设置压缩级别
29             //递归压缩文件夹下的所有文件和字文件夹
30             AddDirToDir(crc, s,zipSourcePath);
31 
32             s.Finish();
33             s.Close();
34         }
35         /// <summary>
36         /// 压缩单个文件
37         /// </summary>
38         /// <param name="zipSourcePath">需要压缩的文件路径(全路径)</param>
39         /// <param name="zipToFilePath">压缩后保存的文件路径(如果是空字符则默认压缩到同目录下文件名为源文件名)</param>
40         public void ZipByFile(string zipSourcePath,string zipToFilePath)
41         {
42             //定义压缩更目录对象
43             Crc32 crc = new Crc32();
44             string dirName = zipSourcePath.Substring(zipSourcePath.LastIndexOf("\\") + 1, zipSourcePath.LastIndexOf(".") - (zipSourcePath.LastIndexOf("\\") + 1)) + ".zip";
45             ZipOutputStream s = new ZipOutputStream(File.Create(zipToFilePath.Equals("")? zipSourcePath.Substring(0,zipSourcePath.LastIndexOf("\\"))+"\\"+ dirName:zipToFilePath));
46             s.SetLevel(6); // 设置压缩级别
47             AddFileToDir(crc,s,zipSourcePath,0);
48             s.Finish();
49             s.Close();
50         }
51         /// <summary>
52         /// 压缩单个文件到指定压缩文件夹下(内部调用)
53         /// </summary>
54         /// <param name="crc"></param>
55         /// <param name="s"></param>
56         /// <param name="file">文件路径</param>
57         public void AddFileToDir(Crc32 crc,ZipOutputStream s,string file,int dotype)
58         {
59             FileStream fs = File.OpenRead(file);
60             byte[] buffer = new byte[fs.Length];
61             fs.Read(buffer, 0, buffer.Length);
62             string filename="";
63             if (dotype == 0)
64                 filename = file.Substring(file.LastIndexOf("\\") + 1);
65             else
66                 filename = file.Substring(file.IndexOf(ZipName));
67             ZipEntry entry = new ZipEntry(filename);
68             entry.DateTime = DateTime.Now;
69             entry.Size = fs.Length;
70             fs.Close();
71             crc.Reset();
72             crc.Update(buffer);
73             entry.Crc = crc.Value;
74             s.PutNextEntry(entry);
75             s.Write(buffer, 0, buffer.Length);
76         }
77         /// <summary>
78         /// 递归文件夹层级(内部调用)
79         /// </summary>
80         /// <param name="crc"></param>
81         /// <param name="s"></param>
82         /// <param name="file"></param>
83         public void AddDirToDir(Crc32 crc, ZipOutputStream s, string file)
84         {
85             //添加此文件夹下的文件
86             string[] files = Directory.GetFiles(file);
87             foreach (string i in files)
88             {
89                 AddFileToDir(crc,s,i,1);
90             }
91             //查询此文件夹下的子文件夹
92             string[] dirs=Directory.GetDirectories(file);
93             foreach (string i in dirs)
94             {
95                 AddDirToDir(crc,s,i);
96             }
97         }
98     }
99 }

 

-------------------------------------------接下来是解压的类------------------------------------------------------

 1 using System;
 2 using System.Text;
 3 using System.Collections;
 4 using System.IO;
 5 using System.Diagnostics;
 6 using System.Runtime.Serialization.Formatters.Binary;
 7 using System.Data;
 8 
 9 using ICSharpCode.SharpZipLib.BZip2;
10 using ICSharpCode.SharpZipLib.Zip;
11 using ICSharpCode.SharpZipLib.Zip.Compression;
12 using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
13 using ICSharpCode.SharpZipLib.GZip;
14 
15 namespace ZipFile
16 {
17     /// <summary>
18     /// 解压文件
19     /// </summary>
20     public class UnZipFile
21     {
22         /// <summary>
23         /// 解压文件方法
24         /// </summary>
25         /// <param name="UnSourceZip">源文件</param>
26         /// <param name="UnZipToPath">解压到目录路径(如果为空字符则是解压到当前目录)</param>
27         public void UnZip(string UnSourceZip,string UnZipToPath)
28         {
29             ZipInputStream s = new ZipInputStream(File.OpenRead(UnSourceZip));
30 
31             ZipEntry theEntry;
32             while ((theEntry = s.GetNextEntry()) != null)
33             {
34 
35                 string fileName = Path.GetFileName(theEntry.Name);
36 
37                 //生成解压目录
38                 if (!UnZipToPath.Equals(""))
39                     Directory.CreateDirectory(UnZipToPath);
40                 else
41                     UnZipToPath = UnSourceZip.Substring(0,UnSourceZip.LastIndexOf("\\")>0?UnSourceZip.LastIndexOf("\\"):0);
42                 if (fileName != String.Empty)
43                 {
44                     //创建文件夹
45                     int startIndex = 0;
46                     while(theEntry.Name.IndexOf("/",startIndex)>0)
47                     {
48                         //计算文件夹路径
49                         string dirpath=theEntry.Name.Substring(0, theEntry.Name.IndexOf("/", startIndex));
50                         //添加文件夹
51                         Directory.CreateDirectory(UnZipToPath.Equals("")? dirpath: UnZipToPath + "//" + dirpath);
52                         startIndex = theEntry.Name.IndexOf("/", startIndex)+1;
53                     }
54                     //解压文件到指定的目录
55                     FileStream streamWriter = File.Create(UnZipToPath.Equals("")? theEntry.Name: UnZipToPath + "//" + theEntry.Name);
56                     int size = 2048;
57                     byte[] data = new byte[2048];
58                     while (true)
59                     {
60                         size = s.Read(data, 0, data.Length);
61                         if (size > 0)
62                         {
63                             streamWriter.Write(data, 0, size);
64                         }
65                         else
66                         {
67                             break;
68                         }
69                     }
70 
71                     streamWriter.Close();
72                 }
73             }
74             s.Close();
75         }
79     }
80 }
posted @ 2012-10-26 16:07  ____陌℡··  阅读(725)  评论(2编辑  收藏  举报