C#實現多級子目錄Zip壓縮解壓實例

来源:https://www.cnblogs.com/QinQouShui/archive/2018/07/07/9276781.html
-Advertisement-
Play Games

參考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重點: 實現多級子目錄的壓縮,類似winrar,可以選擇是否排除基準目錄 1 public void ZipDirectoryTest() ... ...


     

參考

https://blog.csdn.net/lki_suidongdong/article/details/20942977

重點:

實現多級子目錄的壓縮,類似winrar,可以選擇是否排除基準目錄

     

     

     

     

     

   

   

   

 1
				public
				void ZipDirectoryTest()   

 2
				{   

 3
				string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), DateTime.Now.Ticks.ToString());   

 4
				foreach (string sub in
				new
				string[] { "bin", "release", "test", "test\\bin", "" })   

 5
				{   

 6
				string subPath = System.IO.Path.Combine(path, sub);   

 7
				if (!System.IO.Directory.Exists(subPath))   

 8
				System.IO.Directory.CreateDirectory(subPath);   

 9 System.IO.File.WriteAllText(System.IO.Path.Combine(subPath, "1.cs"), "");   

10 System.IO.File.WriteAllText(System.IO.Path.Combine(subPath, "1.txt"), "");   

11 System.IO.File.WriteAllText(System.IO.Path.Combine(subPath, "1.html"), "");   

12 System.IO.File.WriteAllText(System.IO.Path.Combine(subPath, "1.bin"), "");   

13
			

14
				}   

15
				Console.WriteLine(path);   

16
			

17
				new ZipHelper().ZipDirectory(path, "e:\\temp\\tt.zip",false);   

18 ZipHelper.UnZip("e:\\temp\\tt.zip", "e:\\temp\\tt2");   

19
				//System.IO.Directory.Delete(path, true);   

20
				//Q.Helper.FileHelper.SelectFile(path);   
			

21 }  

   

代碼

    

  1
				using System;

  2
			

  3
				using System.Collections.Generic;

  4
			

  5
				using System.Linq;

  6
			

  7
				using System.Text;

  8
			

  9
				using System.IO;

 10
			

 11
				using ICSharpCode.SharpZipLib;

 12
			

 13
				using ICSharpCode.SharpZipLib.Zip;

 14
			

 15
				#if NETSTANDARD2_0

 16
			

 17
				using ICSharpCode.SharpZipLib.Checksum;

 18
			

 19
				#else
			

 20
			

 21
				using ICSharpCode.SharpZipLib.Checksums;

 22
			

 23
				#endif
			

 24
			

 25
			

 26
			

 27
				namespace Q.Helper.Zip

 28
			

 29
				{

 30
			

 31
			

 32
			

 33
				///
				<summary>
			

 34
			

 35
				/// 適用與ZIP壓縮

 36
			

 37
				///
				</summary>
			

 38
			

 39
				public
				class ZipHelper

 40
			

 41
				{

 42
			

 43
				public
				int Level

 44
			

 45
				{

 46
			

 47
				get; set;

 48
			

 49
				}

 50
			

 51
				#region 壓縮

 52
			

 53
			

 54
			

 55
				///
				<summary>
			

 56
			

 57
				/// 遞歸壓縮文件夾的內部方法(排除相對路徑)

 58
			

 59
				///
				</summary>
			

 60
			

 61
				///
				<param name="folderToZip">要壓縮的文件夾路徑</param>
					

 62
			

 63
				///
				<param name="zipStream">壓縮輸出流</param>
					

 64
			

 65
				///
				<param name="parentFolderName">此文件夾的上級文件夾</param>
					

 66
			

 67
				///
				<param name="includeFloderName">是否包含目錄名</param>
					

 68
			

 69
				///
				<returns></returns>
			

 70
			

 71
				private
				bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName, bool createBaseFolder = true)

 72
			

 73
				{

 74
			

 75 folderToZip = folderToZip.Replace("\\", "/");

 76
			

 77
				bool result = true;

 78
			

 79
				string[] folders, files;

 80
			

 81 ZipEntry ent = null;

 82
			

 83 FileStream fs = null;

 84
			

 85 Crc32 crc = new Crc32();

 86
			

 87
			

 88
			

 89
				try
			

 90
			

 91
				{

 92
			

 93
				string entPath = Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/").Replace("\\", "/");

 94
			

 95
				if (!createBaseFolder)

 96
			

 97 entPath = entPath.Substring(entPath.IndexOf("/") + 1);

 98
			

 99
				if (!string.IsNullOrEmpty(entPath))

100
			

101
				{

102
			

103 ent = new ZipEntry(entPath);

104
			

105
				Console.WriteLine(entPath);

106
			

107
				zipStream.PutNextEntry(ent);

108
			

109
				zipStream.Flush();

110
			

111
				}

112
			

113 files = Directory.GetFiles(folderToZip);

114
			

115
				foreach (string file in files)

116
			

117
				{

118
			

119 fs = File.OpenRead(file);

120
			

121
			

122
			

123
				byte[] buffer = new
				byte[fs.Length];

124
			

125 fs.Read(buffer, 0, buffer.Length);

126
			

127 entPath = Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file)).Replace("\\", "/");

128
			

129
				if (!createBaseFolder)

130
			

131 entPath = entPath.Substring(entPath.IndexOf("/") + 1);

132
			

133
				Console.WriteLine(entPath);

134
			

135 ent = new ZipEntry(entPath);

136
			

137 ent.DateTime = DateTime.Now;

138
			

139 ent.Size = fs.Length;

140
			

141
			

142
			

143
				fs.Close();

144
			

145
			

146
			

147
				crc.Reset();

148
			

149
				crc.Update(buffer);

150
			

151
			

152
			

153 ent.Crc = crc.Value;

154
			

155
				zipStream.PutNextEntry(ent);

156
			

157 zipStream.Write(buffer, 0, buffer.Length);

158
			

159
				}

160
			

161
			

162
			

163
				}

164
			

165
				catch (Exception ex)

166
			

167
				{

168
			

169 result = false;

170
			

171
				throw ex;

172
			

173
				}

174
			

175
				finally
			

176
			

177
				{

178
			

179
				if (fs != null)

180
			

181
				{

182
			

183
				fs.Close();

184
			

185
				fs.Dispose();

186
			

187
				}

188
			

189
				if (ent != null)

190
			

191
				{

192
			

193 ent = null;

194
			

195
				}

196
			

197
				GC.Collect();

198
			

199 GC.Collect(1);

200
			

201
				}

202
			

203
			

204
			

205 folders = Directory.GetDirectories(folderToZip);

206
			

207
				//多級遞歸時需要記住相對目錄
			

208
			

209
				foreach (string folder in folders)

210
			

211
				{

212
			

213
				if (!ZipDirectory(folder, zipStream, Path.Combine(parentFolderName, Path.GetFileName(folderToZip)), createBaseFolder))

214
			

215
				return
				false;

216
			

217
				}

218
			

219
				return result;

220
			

221
				}

222
			

223
			

224
			

225
				///
				<summary>
			

226
			

227
				/// 壓縮文件夾

228
			

229
				///
				</summary>
			

230
			

231
				///
				<param name="folderToZip">要壓縮的文件夾路徑</param>
					

232
			

233
				///
				<param name="zipedFile">壓縮文件完整路徑</param>
					

234
			

235
				///
				<param name="password">密碼</param>
					

236
			

237
				///
				<returns>是否壓縮成功</returns>
					

238
			

239
				public
				bool ZipDirectory(string folderToZip, string zipedFile, string password, bool includeFloderName = true)

240
			

241
				{

242
			

243
				bool result = false;

244
			

245
				if (!Directory.Exists(folderToZip))

246
			

247
				return result;

248
			

249
			

250
			

251 ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));

252
			

253
				zipStream.SetLevel(Level);

254
			

255
				if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

256
			

257
			

258
			

259 result = ZipDirectory(folderToZip, zipStream, "", includeFloderName);

260
			

261
			

262
			

263
				zipStream.Finish();

264
			

265
				zipStream.Close();

266
			

267
			

268
			

269
				return result;

270
			

271
				}

272
			

273
			

274
			

275
				///
				<summary>
			

276
			

277
				/// 壓縮文件夾

278
			

279
				///
				</summary>
			

280
			

281
				///
				<param name="folderToZip">要壓縮的文件夾路徑</param>
					

282
			

283
				///
				<param name="zipedFile">壓縮文件完整路徑</param>
					

284
			

285
				///
				<returns>是否壓縮成功</returns>
					

286
			

287
				public
				bool ZipDirectory(string folderToZip, string zipedFile, bool includeFloderName = true)

288
			

289
				{

290
			

291
				bool result = ZipDirectory(folderToZip, zipedFile, "", includeFloderName);

292
			

293
				return result;

294
			

295
				}

296
			

297
			

298
			

299
				///
				<summary>
			

300
			

301
				/// 壓縮文件

302
			

303
				///
				</summary>
			

304
			

305
				///
				<param name="fileToZip">要壓縮的文件全名</param>
					

306
			

307
				///
				<param name="zipedFile">壓縮後的文件名</param>
					

308
			

309
				///
				<param name="password">密碼</param>
					

310
			

311
				///
				<returns>壓縮結果</returns>
					

312
			

313
				public
				bool ZipFile(string fileToZip, string zipedFile, string password)

314
			

315
				{

316
			

317
				bool result = true;

318
			

319 ZipOutputStream zipStream = null;

320
			

321 FileStream fs = null;

322
			

323 ZipEntry ent = null;

324
			

325
			

326
			

327
				if (!File.Exists(fileToZip))

328
			

329
				return
				false;

330
			

331
			

332
			

333
				try
			

334
			

335
				{

336
			

337 fs = File.OpenRead(fileToZip);

338
			

339
				byte[] buffer = new
				byte[fs.Length];

340
			

341 fs.Read(buffer, 0, buffer.Length);

342
			

343
				fs.Close();

344
			

345
			

346
			

347 fs = File.Create(zipedFile);

348
			

349 zipStream = new ZipOutputStream(fs);

350
			

351
				if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

352
			

353 ent = new ZipEntry(Path.GetFileName(fileToZip));

354
			

355
				zipStream.PutNextEntry(ent);

356
			

357
				zipStream.SetLevel(Level);

358
			

359
			

360
			

361 zipStream.Write(buffer, 0, buffer.Length);

362
			

363
			

364
			

365
				}

366
			

367
				catch
			

368
			

369
				{

370
			

371 result = false;

372
			

373
				}

374
			

375
				finally
			

376
			

377
				{

378
			

379
				if (zipStream != null)

380
			

381
				{

382
			

383
				zipStream.Finish();

384
			

385
				zipStream.Close();

386
			

387
				}

388
			

389
				if (ent != null)

390
			

391
				{

392
			

393 ent = null;

394
			

395
				}

396
			

397
				if (fs != null)

398
			

399
				{

400
			

401
				fs.Close();

402
			

403
				fs.Dispose();

404
			

405
				}

406
			

407
				}

408
			

409
				GC.Collect();

410
			

411 GC.Collect(1);

412
			

413
			

414
			

415
				return result;

416
			

417
				}

418
			

419
			

420
			

421
				///
				<summary>
			

422
			

423
				/// 壓縮文件

424
			

425
				///
				</summary>
			

426
			

427
				///
				<param name="fileToZip">要壓縮的文件全名</param>
					

428
			

429
				///
				<param name="zipedFile">壓縮後的文件名</param>
					

430
			

431
				///
				<returns>壓縮結果</returns>
					

432
			

433
				public
				bool ZipFile(string fileToZip, string zipedFile)

434
			

435
				{

436
			

437
				bool result = ZipFile(fileToZip, zipedFile, null);

438
			

439
				return result;

440
			

441
				}

442
			

443
			

444
			

445
				///
				<summary>
			

446
			

447
				/// 壓縮文件或文件夾

448
			

449
				///
				</summary>
			

450
			

451
				///
				<param name="fileToZip">要壓縮的路徑</param>
					

452
			

453
				///
				<param name="zipedFile">壓縮後的文件名</param>
					

454
			

455
				///
				<param name="password">密碼</param>
					

456
			

457
				///
				<returns>壓縮結果</returns>
					

458
			

459
				public
				bool Zip(string fileToZip, string zipedFile, string password)

460
			

461
				{

462
			

463
				bool result = false;

464
			

465
				if (Directory.Exists(fileToZip))

466
			

467 result = ZipDirectory(fileToZip, zipedFile, password);

468
			

469
				else
				if (File.Exists(fileToZip))

470
			

471 result = ZipFile(fileToZip, zipedFile, password);

472
			

473
			

474
			

475
				return result;

476
			

477
				}

478
			

479
			

480
			

481
				///
				<summary>
			

482
			

483
				/// 壓縮文件或文件夾

484
			

485
				///
				</summary>
			

486
			

487
				///
				<param name="fileToZip">要壓縮的路徑</param>
					

488
			

489
				///
				<param name="zipedFile">壓縮後的文件名</param>
					

490
			

491
				///
				<returns>壓縮結果</returns>
					

492
			

493
				public
				bool Zip(string fileToZip, string zipedFile)

494
			

495
				{

496
			

497
				bool result = Zip(fileToZip, zipedFile, null);

498
			

499
				return result;

500
			

501
			

502
			

503
				}

504
			

505
			

506
			

507
				#endregion
			

508
			

509
			

510
			

511
				#region 解壓

512
			

513
			

514
			

515
				///
				<summary>
			

516
			

517
				/// 解壓功能(解壓壓縮文件到指定目錄)

518
			

519
				///
				</summary>
			

520
			

521
				///
				<param name="fileToUnZip">待解壓的文件</param>
					

522
			

523
				///
				<param name="zipedFolder">
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android屏幕解鎖圖案利用Python破解 在 Android 手機上,我們可以通過設置鎖定圖案來當做密碼對手機鎖屏。 在 Android 存儲時使用的是明文轉換後採用散列方式存儲。 這種密碼有三個要求: 最少四個數 最多九個數 無重覆數 加密存儲過程如下: 第一步:隨便輸入一個圖形進行測試 可 ...
  • 第一步:頁面分析 我們要抓取的商品頁面: 這裡我們用正則表達式匹配出該段信息。進一步可以發現它是一個json數據,用json.loads()解析。解析後我們可以藉助線上工具可以查看數據的層級結構,找到需要數據的key。這裡我們把頁面分析與數據提取放到一塊來講了,代碼邏輯: 第三步:開始抓取 第四步: ...
  • 在我們碼字過程中,單元測試是必不可少的。但在從業過程中,很多開發者卻對單元測試望而卻步。有些時候並不是不想寫,而是常常會碰到諸如不能模擬一次HTTP請求,不能讀取配置文件,測試類的構造參數太多等問題,讓開發者放下了碼字的腳步。這些問題確實存在,但它們阻止不了我們那顆要寫單元測試的心。單元測試的優點很... ...
  • 在很多時候我們在生成C#exe文件時,如果在工程里調用了dll文件時,那麼如果不加以處理的話在生成的exe文件運行時需要連同這個dll一起轉移,相比於一個單獨乾凈的exe,這種形式總歸讓人不爽,那麼有辦法讓生成的軟體中直接就包含這個dll文件嗎,這樣就可以不用dll跟著exe走了,避免單獨不能運行的 ...
  • 前幾天做項目用到了動軟代碼生成器 對剛出社會的我來說可以說什麼都不知道,對此趕緊學習了一下才發現這是李天平老師開發的軟體膜拜一下! 以此總結一下 1.軟體基本使用 我在百度下載的是V2.78版的 添加伺服器 選擇要連接的資料庫 點擊連接/測試 看是否成功,同時選擇要連接的資料庫,不然載入全部庫要等好 ...
  • 在學完了C#的方法和數據類型之後,寫了一個簡易的計算器的界面。本次界面具備加減乘除求餘等五項運算。不過存在一點缺陷就是無法判斷輸入數據的類型,是整數還是小數,由於目前所學知識有限,等學到以後再進行完善。 本設計源代碼如下: using System; using System.Collections ...
  • 這個系列文章介紹的是Identity Server 4 的 Hybrid Flow, 前兩篇文章介紹瞭如何保護MVC客戶端, 本文介紹如何保護API資源. 保護MVC客戶端的文章: https://www.cnblogs.com/cgzl/p/9253667.html, https://www.cn ...
  • 前言 距離上一篇文章《基於EF Core的Code First模式的DotNetCore快速開發框架》已過去大半個年頭,時光荏苒,歲月如梭。。。比較尷尬的是,在這大半個年頭裡,除了日常帶娃溜娃做飯,偶爾接幾個私單外,個人開源項目幾乎沒啥動靜。那麼日常工作幹些什麼呢?肯定是堅守Nfx啊。。。為什麼呢? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...