C#压缩帮助类(SharpZipLib)
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
一、SharpZipLib官网二、压缩帮助类1. /*** 2. * Title:"基础工具" 项目 3. * Title:"基础工具" 项目 4. * 主题:压缩包帮助类 5. * Description: 6. * 功能: 7. * 1、压缩单个文件 8. * 2、压缩多个文件 9. * 3、压缩多层目录 10.* 4、递归遍历目录 11.* 5、解压缩一个 zip 文件 12.* 6、获取压缩文件中指定类型的文件 13.* 7、获取压缩文件中的所有文件 14.* Date:2021 15.* Version:0.1版本 16.* Author:Coffee 17.* Modify Recoder: 18.*/ 19. 20.using ICSharpCode.SharpZipLib.Zip; 21.using System; 22.using System.Collections.Generic; 23.using System.IO; 24.using System.Text; 25. 26.namespace Utils.Zip 27.{ 28. class ZipHelper2 29. { 30. /// <summary> 31. /// 压缩单个文件 32. /// </summary> 33. /// <param name="fileToZip">要压缩的文件</param> 34. /// <param name="zipedFile">压缩后的文件</param> 35. /// <param name="compressionLevel">压缩等级</param> 36. /// <param name="blockSize">每次写入大小</param> 37. public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize) 38. { 39. //如果文件没有找到,则报错 40. if (!System.IO.File.Exists(fileToZip)) 41. { 42. throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); 43. } 44. 45. using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) 46. { 47. using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) 48. { 49. using (System.IO.FileStream StreamToZip = new System.IO.FileStream(fileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 50. { 51. string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); 52. ZipEntry ZipEntry = new ZipEntry(fileName); 53. ZipStream.PutNextEntry(ZipEntry); 54. ZipStream.SetLevel(compressionLevel); 55. byte[] buffer = new byte[blockSize]; 56. int sizeRead = 0; 57. 58. try 59. { 60. do 61. { 62. sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); 63. ZipStream.Write(buffer, 0, sizeRead); 64. } 65. while (sizeRead > 0); 66. } 67. catch (System.Exception ex) 68. { 69. throw ex; 70. } 71. StreamToZip.Close(); 72. } 73. ZipStream.Finish(); 74. ZipStream.Close(); 75. } 76. ZipFile.Close(); 77. } 78. } 79. 80. /// <summary> 81. /// 压缩单个文件 82. /// </summary> 83. /// <param name="fileToZip">要进行压缩的文件名</param> 84. /// <param name="zipedFile">压缩后生成的压缩文件名</param> 85. public static void ZipFile(string fileToZip, string zipedFile) 86. { 87. //如果文件没有找到,则报错 88. if (!File.Exists(fileToZip)) 89. { 90. throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); 91. } 92. 93. using (FileStream fs = File.OpenRead(fileToZip)) 94. { 95. byte[] buffer = new byte[fs.Length]; 96. fs.Read(buffer, 0, buffer.Length); 97. fs.Close(); 98. 99. using (FileStream ZipFile = File.Create(zipedFile)) 100. { 101. using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) 102. { 103. string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); 104. ZipEntry ZipEntry = new ZipEntry(fileName); 105. ZipStream.PutNextEntry(ZipEntry); 106. ZipStream.SetLevel(5); 107. 108. ZipStream.Write(buffer, 0, buffer.Length); 109. ZipStream.Finish(); 110. ZipStream.Close(); 111. } 112. } 113. } 114. } 115. 116. /// <summary> 117. /// 压缩多个文件到指定路径 118. /// </summary> 119. /// <param name="sourceFileNames">压缩到哪个路径</param> 120. /// <param name="zipFileName">压缩文件名称</param> 121. public static void ZipFile(List<string> sourceFileNames, string zipFileName) 122. { 123. //压缩文件打包 124. using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFileName))) 125. { 126. s.SetLevel(9); 127. byte[] buffer = new byte[4096]; 128. foreach (string file in sourceFileNames) 129. { 130. if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 131. { 132. string pPath = ""; 133. pPath += Path.GetFileName(file); 134. pPath += "\\"; 135. ZipSetp(file, s, pPath, sourceFileNames); 136. } 137. else // 否则直接压缩文件 138. { 139. ZipEntry entry = new ZipEntry(Path.GetFileName(file)); 140. entry.DateTime = DateTime.Now; 141. s.PutNextEntry(entry); 142. using (FileStream fs = File.OpenRead(file)) 143. { 144. int sourceBytes; 145. do 146. { 147. sourceBytes = fs.Read(buffer, 0, buffer.Length); 148. s.Write(buffer, 0, sourceBytes); 149. } while (sourceBytes > 0); 150. } 151. } 152. } 153. s.Finish(); 154. s.Close(); 155. } 156. } 157. 158. /// <summary> 159. /// 压缩多层目录 160. /// </summary> 161. /// <param name="strDirectory">待压缩目录</param> 162. /// <param name="zipedFile">压缩后生成的压缩文件名,绝对路径</param> 163. public static void ZipFileDirectory(string strDirectory, string zipedFile) 164. { 165. using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) 166. { 167. using (ZipOutputStream s = new ZipOutputStream(ZipFile)) 168. { 169. s.SetLevel(9); 170. ZipSetp(strDirectory, s, ""); 171. } 172. } 173. } 174. 175. /// <summary> 176. /// 压缩多层目录 177. /// </summary> 178. /// <param name="strDirectory">待压缩目录</param> 179. /// <param name="zipedFile">压缩后生成的压缩文件名,绝对路径</param> 180. /// <param name="files">指定要压缩的文件列表(完全路径)</param> 181. public static void ZipFileDirectory(string strDirectory, string zipedFile, List<string> files) 182. { 183. using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) 184. { 185. using (ZipOutputStream s = new ZipOutputStream(ZipFile)) 186. { 187. s.SetLevel(9); 188. ZipSetp(strDirectory, s, "", files); 189. } 190. } 191. } 192. 193. /// <summary> 194. /// 递归遍历目录 195. /// </summary> 196. /// <param name="strDirectory">需遍历的目录</param> 197. /// <param name="s">压缩输出流对象</param> 198. /// <param name="parentPath">The parent path.</param> 199. /// <param name="files">需要压缩的文件</param> 200. private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, List<string> files = null) 201. { 202. if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar) 203. { 204. strDirectory += Path.DirectorySeparatorChar; 205. } 206. 207. string[] filenames = Directory.GetFileSystemEntries(strDirectory); 208. 209. byte[] buffer = new byte[4096]; 210. foreach (string file in filenames)// 遍历所有的文件和目录 211. { 212. if (files != null && !files.Contains(file)) 213. { 214. continue; 215. } 216. if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 217. { 218. string pPath = parentPath; 219. pPath += Path.GetFileName(file); 220. pPath += "\\"; 221. ZipSetp(file, s, pPath, files); 222. } 223. else // 否则直接压缩文件 224. { 225. //打开压缩文件 226. string fileName = parentPath + Path.GetFileName(file); 227. ZipEntry entry = new ZipEntry(fileName); 228. 229. entry.DateTime = DateTime.Now; 230. 231. s.PutNextEntry(entry); 232. using (FileStream fs = File.OpenRead(file)) 233. { 234. int sourceBytes; 235. do 236. { 237. sourceBytes = fs.Read(buffer, 0, buffer.Length); 238. s.Write(buffer, 0, sourceBytes); 239. } while (sourceBytes > 0); 240. } 241. } 242. } 243. } 244. 245. /// <summary> 246. /// 解压缩一个 zip 文件。 247. /// </summary> 248. /// <param name="zipedFile">压缩文件</param> 249. /// <param name="strDirectory">解压目录</param> 250. /// <param name="password">zip 文件的密码。</param> 251. /// <param name="overWrite">是否覆盖已存在的文件。</param> 252. public static void UnZip(string zipedFile, string strDirectory, bool overWrite, string password) 253. { 254. if (strDirectory == "") 255. strDirectory = Directory.GetCurrentDirectory(); 256. if (!strDirectory.EndsWith("\\")) 257. strDirectory = strDirectory + "\\"; 258. 259. using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) 260. { 261. if (password != null) 262. { 263. s.Password = password; 264. } 265. ZipEntry theEntry; 266. while ((theEntry = s.GetNextEntry()) != null) 267. { 268. string directoryName = ""; 269. string pathToZip = ""; 270. pathToZip = theEntry.Name; 271. 272. if (pathToZip != "") 273. directoryName = Path.GetDirectoryName(pathToZip) + "\\"; 274. string fileName = Path.GetFileName(pathToZip); 275. Directory.CreateDirectory(strDirectory + directoryName); 276. if (fileName != "") 277. { 278. if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName))) 279. { 280. using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName)) 281. { 282. int size = 2048; 283. byte[] data = new byte[2048]; 284. while (true) 285. { 286. size = s.Read(data, 0, data.Length); 287. if (size > 0) 288. streamWriter.Write(data, 0, size); 289. else 290. break; 291. } 292. streamWriter.Close(); 293. } 294. } 295. } 296. } 297. s.Close(); 298. } 299. } 300. 301. /// <summary> 302. /// 解压缩一个 zip 文件。 303. /// </summary> 304. /// <param name="zipedFile">压缩文件</param> 305. /// <param name="strDirectory">解压目录</param> 306. /// <param name="overWrite">是否覆盖已存在的文件。</param> 307. public static void UnZip(string zipedFile, string strDirectory, bool overWrite) 308. { 309. UnZip(zipedFile, strDirectory, overWrite, null); 310. } 311. 312. /// <summary> 313. /// 解压缩一个 zip 文件。 314. /// 覆盖已存在的文件。 315. /// </summary> 316. /// <param name="zipedFile">压缩文件</param> 317. /// <param name="strDirectory">解压目录</param> 318. public static void UnZip(string zipedFile, string strDirectory) 319. { 320. UnZip(zipedFile, strDirectory, true); 321. } 322. 323. /// <summary> 324. /// 获取压缩文件中指定类型的文件 325. /// </summary> 326. /// <param name="zipedFile">压缩文件</param> 327. /// <param name="fileExtension">文件类型(.txt|.exe)</param> 328. /// <returns>文件名称列表(包含子目录)</returns> 329. public static List<string> GetFiles(string zipedFile, List<string> fileExtension) 330. { 331. List<string> files = new List<string>(); 332. if (!File.Exists(zipedFile)) 333. { 334. //return files; 335. throw new FileNotFoundException(zipedFile); 336. } 337. 338. using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) 339. { 340. ZipEntry theEntry; 341. while ((theEntry = s.GetNextEntry()) != null) 342. { 343. if (theEntry.IsFile) 344. { 345. //Console.WriteLine("Name : {0}", theEntry.Name); 346. if (fileExtension != null) 347. { 348. if (fileExtension.Contains(Path.GetExtension(theEntry.Name))) 349. { 350. files.Add(theEntry.Name); 351. } 352. } 353. else 354. { 355. files.Add(theEntry.Name); 356. } 357. } 358. } 359. s.Close(); 360. } 361. return files; 362. } 363. 364. /// <summary> 365. /// 获取压缩文件中的所有文件 366. /// </summary> 367. /// <param name="zipedFile">压缩文件</param> 368. /// <returns>文件名称列表(包含子目录)</returns> 369. public static List<string> GetFiles(string zipedFile) 370. { 371. return GetFiles(zipedFile, null); 372. } 373. }//Class_end 374. } 三、SharpZipLib类的用法参考该文章在 2023/12/31 16:51:29 编辑过 |
关键字查询
相关文章
正在查询... |