C#.NET: Compress/Decompress zip file using System.IO.Packaging
.NET 中常见的 ZIP 操作类库: SharpZipLib,J# Zip Library,zLib.NET。
.NET 3.0 开始,新增了 System.IO.Packaging.ZipPackage,从此再不用第三方的Lib了。
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.IO.Packaging;
5
6 public class SharpZip
7 {
8 private const long BUFFER_SIZE = 4096;
9
10 public static void CompressFiles(List<string> fileNames, string zipFileName)
11 {
12 foreach (string file in fileNames)
13 {
14 CompressFile(zipFileName, file);
15 }
16 }
17
18 public static void CompressFile(string zipFilename, string fileToAdd)
19 {
20 using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
21 {
22 string destFilename = ".\\" + Path.GetFileName(fileToAdd);
23 Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
24 if (zip.PartExists(uri))
25 {
26 zip.DeletePart(uri);
27 }
28 PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);
29 using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
30 {
31 using (Stream dest = part.GetStream())
32 {
33 CopyStream(fileStream, dest);
34 }
35 }
36 }
37 }
38
39 public static void DecompressFile(string zipFilename, string outPath)
40 {
41 using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.Open))
42 {
43 foreach (PackagePart part in zip.GetParts())
44 {
45 string outFileName = Path.Combine(outPath, part.Uri.OriginalString.Substring(1));
46 using (System.IO.FileStream outFileStream = new System.IO.FileStream(outFileName, FileMode.Create))
47 {
48 using (Stream inFileStream = part.GetStream())
49 {
50 CopyStream(inFileStream, outFileStream);
51 }
52 }
53 }
54 }
55 }
56
57 private static void CopyStream(System.IO.Stream inputStream, System.IO.Stream outputStream)
58 {
59 long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE;
60 byte[] buffer = new byte[bufferSize];
61 int bytesRead = 0;
62 long bytesWritten = 0;
63 while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0)
64 {
65 outputStream.Write(buffer, 0, bytesRead);
66 bytesWritten += bufferSize;
67 }
68 }
69 }
2 using System.Collections.Generic;
3 using System.IO;
4 using System.IO.Packaging;
5
6 public class SharpZip
7 {
8 private const long BUFFER_SIZE = 4096;
9
10 public static void CompressFiles(List<string> fileNames, string zipFileName)
11 {
12 foreach (string file in fileNames)
13 {
14 CompressFile(zipFileName, file);
15 }
16 }
17
18 public static void CompressFile(string zipFilename, string fileToAdd)
19 {
20 using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
21 {
22 string destFilename = ".\\" + Path.GetFileName(fileToAdd);
23 Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
24 if (zip.PartExists(uri))
25 {
26 zip.DeletePart(uri);
27 }
28 PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);
29 using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
30 {
31 using (Stream dest = part.GetStream())
32 {
33 CopyStream(fileStream, dest);
34 }
35 }
36 }
37 }
38
39 public static void DecompressFile(string zipFilename, string outPath)
40 {
41 using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.Open))
42 {
43 foreach (PackagePart part in zip.GetParts())
44 {
45 string outFileName = Path.Combine(outPath, part.Uri.OriginalString.Substring(1));
46 using (System.IO.FileStream outFileStream = new System.IO.FileStream(outFileName, FileMode.Create))
47 {
48 using (Stream inFileStream = part.GetStream())
49 {
50 CopyStream(inFileStream, outFileStream);
51 }
52 }
53 }
54 }
55 }
56
57 private static void CopyStream(System.IO.Stream inputStream, System.IO.Stream outputStream)
58 {
59 long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE;
60 byte[] buffer = new byte[bufferSize];
61 int bytesRead = 0;
62 long bytesWritten = 0;
63 while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0)
64 {
65 outputStream.Write(buffer, 0, bytesRead);
66 bytesWritten += bufferSize;
67 }
68 }
69 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2007-10-20 javascript中outerHTML innerHTML innerTEXT 三者的区别
2007-10-20 以编程方式控制ScriptManager
2007-10-20 RDLC 报表客户端部署方案
2007-10-20 TabContainer实现服务器端回传