.NET C# 将文件夹压缩至 zip
创始人
2024-11-14 12:35:29
0次

.NET C# 将文件夹压缩至 zip

文章目录

  • .NET C# 将文件夹压缩至 zip
    • 1 使用 System.IO.Compression
      • 1.1 环境
      • 1.2 压缩文件夹
        • 1.2.1 简单压缩
        • 1.2.2 复杂压缩
      • 1.3 解压缩
        • 1.3.1 简单解压缩
        • 1.3.2 复杂解压缩
    • 2 使用 SharpZipLib
      • 2.1 环境
      • 2.2 压缩文件夹
      • 2.3 解压缩
    • 3 压缩效果简单测试

1 使用 System.IO.Compression

1.1 环境

  • .NET 6

1.2 压缩文件夹

1.2.1 简单压缩
using System.IO.Compression;  string sourceDirectory = @"C:\path\to\your\folder"; // 需要压缩的文件夹路径 string destinationZipFilePath = @"C:\path\to\your\output.zip"; // 生成的zip文件路径 // 压缩文件夹 ZipFile.CreateFromDirectory(sourceDirectory, destinationZipFilePath); 

注意事项

  • 请确保路径正确,并且具有对该路径的读写权限。
  • 如果目标zip文件已存在,该方法将覆盖该文件。如果你想避免覆盖,可以在压缩前检查文件是否存在,并进行相应处理。
1.2.2 复杂压缩

如果你需要更复杂的压缩选项,比如排除某些文件或文件夹,可以使用ZipArchive类来进行更细粒度的控制。

using System.IO.Compression;  string sourceDirectory = @"C:\path\to\your\folder"; string destinationZipFilePath = @"C:\path\to\your\output.zip";  using (FileStream zipToOpen = new FileStream(destinationZipFilePath, FileMode.Create)) {     using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))     {         DirectoryInfo directorySelected = new DirectoryInfo(sourceDirectory);          foreach (FileInfo fileToCompress in directorySelected.GetFiles())         {             // 过滤特定文件(例如,排除所有.txt文件)             if (fileToCompress.Extension == ".txt")                 continue;              archive.CreateEntryFromFile(fileToCompress.FullName, fileToCompress.Name);         }     } } 

1.3 解压缩

1.3.1 简单解压缩
using System.IO.Compression;  string sourceZipFilePath = @"C:\path\to\your\archive.zip"; // 需要解压缩的zip文件路径 string destinationDirectory = @"C:\path\to\your\output\folder"; // 解压缩到的目标文件夹路径 // 解压缩zip文件 ZipFile.ExtractToDirectory(sourceZipFilePath, destinationDirectory); 

注意事项

  • 请确保路径正确,并且具有对该路径的读写权限。
  • 如果目标文件夹已存在且包含与zip文件中相同名称的文件,该方法将抛出异常。如果你想避免此问题,可以在解压缩前检查文件夹是否存在,并进行相应处理。
1.3.2 复杂解压缩
using System.IO.Compression;  string sourceZipFilePath = @"C:\path\to\your\archive.zip"; string destinationDirectory = @"C:\path\to\your\output\folder";  using (ZipArchive archive = ZipFile.OpenRead(sourceZipFilePath)) {     foreach (ZipArchiveEntry entry in archive.Entries)     {         // 解压缩所有文件到目标文件夹         string destinationPath = Path.Combine(destinationDirectory, entry.FullName);          // 如果条目是目录,则创建目录         if (entry.Name == "")         {             Directory.CreateDirectory(destinationPath);         }         else         {             // 创建包含该条目的目录             Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));              // 解压缩文件             entry.ExtractToFile(destinationPath, overwrite: true);         }     } } 

2 使用 SharpZipLib

2.1 环境

  • .NET 6
  • SharpZipLib 1.4.2

2.2 压缩文件夹

using System; using System.IO; using ICSharpCode.SharpZipLib.Zip;  class Program {     static void Main()     {         string sourceDirectory = @"C:\path\to\your\folder"; // 需要压缩的文件夹路径         string destinationZipFilePath = @"C:\path\to\your\output.zip"; // 生成的zip文件路径          // 压缩文件夹         CompressFolder(sourceDirectory, destinationZipFilePath);          Console.WriteLine("文件夹已成功压缩到 " + destinationZipFilePath);     }      static void CompressFolder(string sourceDir, string zipFilePath)     {         // 创建目标zip文件         using (FileStream fsOut = File.Create(zipFilePath))         using (ZipOutputStream zipStream = new ZipOutputStream(fsOut))         {             zipStream.SetLevel(3); // 设置压缩级别(0-9)              // 遍历源文件夹中的所有文件和目录             int folderOffset = sourceDir.Length + (sourceDir.EndsWith("\\") ? 0 : 1);              CompressDirectory(sourceDir, zipStream, folderOffset);         }     }      static void CompressDirectory(string path, ZipOutputStream zipStream, int folderOffset)     {         string[] files = Directory.GetFiles(path);          foreach (string filename in files)         {             FileInfo fi = new FileInfo(filename);              string entryName = filename.Substring(folderOffset); // 创建条目名             entryName = ZipEntry.CleanName(entryName); // 清理名称              ZipEntry newEntry = new ZipEntry(entryName);             newEntry.DateTime = fi.LastWriteTime; // 设置条目的日期时间             newEntry.Size = fi.Length; // 设置条目的大小              zipStream.PutNextEntry(newEntry);              // 写入文件内容             byte[] buffer = new byte[4096];             using (FileStream streamReader = File.OpenRead(filename))             {                 StreamUtils.Copy(streamReader, zipStream, buffer);             }             zipStream.CloseEntry();         }          // 递归处理目录         string[] folders = Directory.GetDirectories(path);         foreach (string folder in folders)         {             CompressDirectory(folder, zipStream, folderOffset);         }     } } 

2.3 解压缩

using System; using System.IO; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip;  class Program {     static void Main()     {         string sourceZipFilePath = @"C:\path\to\your\archive.zip"; // 需要解压缩的zip文件路径         string destinationDirectory = @"C:\path\to\your\output\folder"; // 解压缩到的目标文件夹路径          // 解压缩zip文件         ExtractZipFile(sourceZipFilePath, destinationDirectory);          Console.WriteLine("文件已成功解压缩到 " + destinationDirectory);     }      static void ExtractZipFile(string archiveFilenameIn, string outFolder)     {         ZipFile zf = null;         try         {             FileStream fs = File.OpenRead(archiveFilenameIn);             zf = new ZipFile(fs);              foreach (ZipEntry zipEntry in zf)             {                 if (!zipEntry.IsFile)                 {                     continue; // 忽略目录条目                 }                  string entryFileName = zipEntry.Name;                 string fullZipToPath = Path.Combine(outFolder, entryFileName);                 string directoryName = Path.GetDirectoryName(fullZipToPath);                  // 创建目录                 if (directoryName.Length > 0)                 {                     Directory.CreateDirectory(directoryName);                 }                  byte[] buffer = new byte[4096]; // 4K是推荐的缓冲区大小                  // 解压缩文件                 using (Stream zipStream = zf.GetInputStream(zipEntry))                 using (FileStream streamWriter = File.Create(fullZipToPath))                 {                     StreamUtils.Copy(zipStream, streamWriter, buffer);                 }             }         }         finally         {             if (zf != null)             {                 zf.IsStreamOwner = true; // 使ZipFile也关闭文件流                 zf.Close();             }         }     } } 

3 压缩效果简单测试

组件压缩等级耗时(ms)结果数据大小(KB)
System.IO.Compression124233360197
535895354376
9137136351221
SharpZipLibNoCompression8561046400
Fastest11571373848
Optimal18642353490
SmallestSize85536351208

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...