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 }