C#实现多级子目录Zip压缩解压实例

     

参考

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">指定解压目标目录</param>
					

524
			

525
				///
				<param name="password">密码</param>
					

526
			

527
				///
				<returns>解压结果</returns>
					

528
			

529
				public
				static
				bool UnZip(string fileToUnZip, string zipedFolder, string password)

530
			

531
				{

532
			

533
				bool result = true;

534
			

535
			

536
			

537 ZipInputStream zipStream = null;

538
			

539 ZipEntry ent = null;

540
			

541
				string fileName;

542
			

543
			

544
			

545
				if (!File.Exists(fileToUnZip))

546
			

547
				return
				false;

548
			

549
			

550
			

551
				if (!Directory.Exists(zipedFolder))

552
			

553
				Directory.CreateDirectory(zipedFolder);

554
			

555
			

556
			

557
				try
			

558
			

559
				{

560
			

561 zipStream = new ZipInputStream(File.OpenRead(fileToUnZip));

562
			

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

564
			

565
				while ((ent = zipStream.GetNextEntry()) != null)

566
			

567
				{

568
			

569
				if (!string.IsNullOrEmpty(ent.Name))

570
			

571
				{

572
			

573 fileName = Path.Combine(zipedFolder, ent.Name);

574
			

575 fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi
			

576
			

577
			

578
			

579
				if (fileName.EndsWith("\\"))

580
			

581
				{

582
			

583
				Directory.CreateDirectory(fileName);

584
			

585
				continue;

586
			

587
				}

588
			

589
				using (FileStream fs = File.Create(fileName))

590
			

591
				{

592
			

593
				int size = 2048;

594
			

595
				byte[] data = new
				byte[size];

596
			

597
				while (true)

598
			

599
				{

600
			

601
			

602
			

603 size = zipStream.Read(data, 0, data.Length);

604
			

605
				if (size > 0)

606
			

607 fs.Write(data, 0, data.Length);

608
			

609
				else
			

610
			

611
				break;

612
			

613
				}

614
			

615
				fs.Flush();

616
			

617
			

618
			

619
				fs.Close();

620
			

621
				new FileInfo(fileName).LastWriteTime = ent.DateTime;

622
			

623
				}

624
			

625
			

626
			

627
				}

628
			

629
				}

630
			

631
				}

632
			

633
				catch
			

634
			

635
				{

636
			

637 result = false;

638
			

639
				}

640
			

641
				finally
			

642
			

643
				{

644
			

645
			

646
			

647
				if (zipStream != null)

648
			

649
				{

650
			

651
				zipStream.Close();

652
			

653
				zipStream.Dispose();

654
			

655
				}

656
			

657
				if (ent != null)

658
			

659
				{

660
			

661 ent = null;

662
			

663
				}

664
			

665
				GC.Collect();

666
			

667 GC.Collect(1);

668
			

669
				}

670
			

671
				return result;

672
			

673
				}

674
			

675
			

676
			

677
				///
				<summary>
			

678
			

679
				/// 解压功能(解压压缩文件到指定目录)

680
			

681
				///
				</summary>
			

682
			

683
				///
				<param name="fileToUnZip">待解压的文件</param>
					

684
			

685
				///
				<param name="zipedFolder">指定解压目标目录</param>
					

686
			

687
				///
				<returns>解压结果</returns>
					

688
			

689
				public
				static
				bool UnZip(string fileToUnZip, string zipedFolder)

690
			

691
				{

692
			

693
				bool result = UnZip(fileToUnZip, zipedFolder, null);

694
			

695
				return result;

696
			

697
				}

698
			

699
			

700
			

701
				#endregion
			

702
			

703
				}

704
			

705 }

   

   

posted @ 2018-07-07 11:31  秦秋随  阅读(919)  评论(1编辑  收藏  举报