Creating Directories in a ZipArchive C# .Net 4.5

后端 未结 8 1921
星月不相逢
星月不相逢 2020-12-03 10:06

A ZipArchive is a collection of ZipArchiveEntries, and adding/removing \"Entries\" works nicely. But it appears there is no notion of directories / nested \"Archives\". In t

8条回答
  •  星月不相逢
    2020-12-03 10:19

    I know I'm late to the party (7.25.2018),

    this works flawlessly to me, even with recursive directories.

    Firstly, remember to install the NuGet package:

    Install-Package System.IO.Compression

    And then, Extension file for ZipArchive:

     public static class ZipArchiveExtension {
    
         public static void CreateEntryFromAny(this ZipArchive archive, string sourceName, string entryName = "") {
             var fileName = Path.GetFileName(sourceName);
             if (File.GetAttributes(sourceName).HasFlag(FileAttributes.Directory)) {
                 archive.CreateEntryFromDirectory(sourceName, Path.Combine(entryName, fileName));
             } else {
                 archive.CreateEntryFromFile(sourceName, Path.Combine(entryName, fileName), CompressionLevel.Fastest);
             }
         }
    
         public static void CreateEntryFromDirectory(this ZipArchive archive, string sourceDirName, string entryName = "") {
             string[] files = Directory.GetFiles(sourceDirName).Concat(Directory.GetDirectories(sourceDirName)).ToArray();
             archive.CreateEntry(Path.Combine(entryName, Path.GetFileName(sourceDirName)));
             foreach (var file in files) {
                 archive.CreateEntryFromAny(file, entryName);
             }
         }
     }
    

    And then you can pack anything, whether it is file or directory:

    using (var memoryStream = new MemoryStream()) {
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) {
            archive.CreateEntryFromAny(sourcePath);
        }
    }
    

提交回复
热议问题