首页 > 代码库 > C#利用SharpZipLib解压或压缩文件(支持多层目录递归压缩)
C#利用SharpZipLib解压或压缩文件(支持多层目录递归压缩)
需要下载ICSharpCode.SharpZipLib.dll
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using System.IO; 8 using ICSharpCode.SharpZipLib.Checksums; 9 using ICSharpCode.SharpZipLib.Zip; 10 using ICSharpCode.SharpZipLib.GZip; 11 12 namespace ZYOfficeWrap 13 { 14 15 /// <summary> 16 /// 压缩文件格式 17 /// </summary> 18 19 public enum fileType 20 { 21 Zip = 1, 22 RAR = 2, 23 Tar =3 24 } 25 /// <summary> 26 /// 文件解压缩操作类库 27 /// </summary> 28 public class FileZipOpr 29 { 30 /// <summary> 31 /// 构造函数 32 /// </summary> 33 public FileZipOpr() 34 { 35 36 } 37 38 /// <summary> 39 /// 压缩单个文件 40 /// </summary> 41 /// <param name="fileToZip">要压缩的文件</param> 42 /// <param name="zipedFile">压缩后的文件</param> 43 /// <param name="compressionLevel">压缩等级</param> 44 /// <param name="blockSize">每次写入大小</param> 45 public void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize) 46 { 47 //如果文件没有找到,则报错 48 if (!File.Exists(fileToZip)) 49 { 50 throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); 51 } 52 53 using (FileStream ZipFile = File.Create(zipedFile)) 54 { 55 using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) 56 { 57 using (FileStream StreamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read)) 58 { 59 string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); 60 ZipEntry ZipEntry = new ZipEntry(fileName); 61 ZipStream.PutNextEntry(ZipEntry); 62 ZipStream.SetLevel(compressionLevel); 63 byte[] buffer = new byte[blockSize]; 64 int sizeRead = 0; 65 try 66 { 67 do 68 { 69 sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); 70 ZipStream.Write(buffer, 0, sizeRead); 71 } 72 while (sizeRead > 0); 73 } 74 catch (System.Exception ex) 75 { 76 throw ex; 77 } 78 StreamToZip.Close(); 79 } 80 81 ZipStream.Finish(); 82 ZipStream.Close(); 83 } 84 ZipFile.Close(); 85 } 86 } 87 88 /// <summary> 89 /// 压缩单个文件 90 /// </summary> 91 /// <param name="fileToZip">要进行压缩的文件名</param> 92 /// <param name="zipedFile">压缩后生成的压缩文件名</param> 93 public void ZipFile(string fileToZip, string zipedFile) 94 { 95 //如果文件没有找到,则报错 96 if (!File.Exists(fileToZip)) 97 { 98 throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); 99 }100 101 using (FileStream fs = File.OpenRead(fileToZip))102 {103 byte[] buffer = new byte[fs.Length];104 fs.Read(buffer, 0, buffer.Length);105 fs.Close();106 107 using (FileStream ZipFile = File.Create(zipedFile))108 {109 using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))110 {111 string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);112 ZipEntry ZipEntry = new ZipEntry(fileName);113 ZipStream.PutNextEntry(ZipEntry);114 ZipStream.SetLevel(5);115 116 ZipStream.Write(buffer, 0, buffer.Length);117 ZipStream.Finish();118 ZipStream.Close();119 }120 }121 }122 }123 124 /// <summary>125 /// 压缩多层目录126 /// </summary>127 /// <param name="strDirectory">要进行压缩的文件夹</param>128 /// <param name="zipedFile">压缩后生成的压缩文件名</param>129 public void ZipFileDirectory(string strDirectory, string zipedFile)130 {131 using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))132 {133 using (ZipOutputStream s = new ZipOutputStream(ZipFile))134 {135 ZipSetp(strDirectory, s, "");136 }137 }138 }139 140 /// <summary>141 /// 递归遍历目录142 /// </summary>143 /// <param name="strDirectory">文件夹名称</param>144 /// <param name="s">The ZipOutputStream Object.</param>145 /// <param name="parentPath"></param>146 private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath)147 {148 if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)149 {150 strDirectory += Path.DirectorySeparatorChar;151 }152 Crc32 crc = new Crc32();153 154 string[] filenames = Directory.GetFileSystemEntries(strDirectory);155 156 foreach (string file in filenames)// 遍历所有的文件和目录157 {158 159 if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件160 {161 string pPath = parentPath;162 pPath += file.Substring(file.LastIndexOf("\\") + 1);163 pPath += "\\";164 ZipSetp(file, s, pPath);165 }166 167 else // 否则直接压缩文件168 {169 //打开压缩文件170 using (FileStream fs = File.OpenRead(file))171 {172 173 byte[] buffer = new byte[fs.Length];174 fs.Read(buffer, 0, buffer.Length);175 176 string fileName = parentPath + file.Substring(file.LastIndexOf("\\") + 1);177 ZipEntry entry = new ZipEntry(fileName);178 179 entry.DateTime = DateTime.Now;180 entry.Size = fs.Length;181 182 fs.Close();183 184 crc.Reset();185 crc.Update(buffer);186 187 entry.Crc = crc.Value;188 s.PutNextEntry(entry);189 190 s.Write(buffer, 0, buffer.Length);191 }192 }193 }194 }195 196 /// <summary>197 /// 解压缩一个 zip 文件。198 /// </summary>199 /// <param name="zipedFile">The ziped file.</param>200 /// <param name="strDirectory">The STR directory.</param>201 /// <param name="password">zip 文件的密码。</param>202 /// <param name="overWrite">是否覆盖已存在的文件。</param>203 public void UnZipFile(string zipedFile, string strDirectory, string password, bool overWrite)204 {205 206 if (strDirectory == "")207 strDirectory = Directory.GetCurrentDirectory();208 if (!strDirectory.EndsWith("\\"))209 strDirectory = strDirectory + "\\";210 211 using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))212 {213 s.Password = password;214 ZipEntry theEntry;215 216 while ((theEntry = s.GetNextEntry()) != null)217 {218 string directoryName = "";219 string pathToZip = "";220 pathToZip = theEntry.Name;221 222 if (pathToZip != "")223 directoryName = Path.GetDirectoryName(pathToZip) + "\\";224 225 string fileName = Path.GetFileName(pathToZip);226 227 Directory.CreateDirectory(strDirectory + directoryName);228 229 if (fileName != "")230 {231 if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName)))232 {233 using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName))234 {235 int size = 2048;236 byte[] data = http://www.mamicode.com/new byte[2048];237 while (true)238 {239 size = s.Read(data, 0, data.Length);240 241 if (size > 0)242 streamWriter.Write(data, 0, size);243 else244 break;245 }246 streamWriter.Close();247 }248 }249 }250 }251 252 s.Close();253 }254 }255 256 }257 }
C#利用SharpZipLib解压或压缩文件(支持多层目录递归压缩)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。