Creating Directories in a ZipArchive C# .Net 4.5

后端 未结 8 1925
星月不相逢
星月不相逢 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:08

    If you are working on a project that can use full .NET you may try to use the ZipFile.CreateFromDirectory method, as explained here:

    using System;
    using System.IO;
    using System.IO.Compression;
    
    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                string startPath = @"c:\example\start";
                string zipPath = @"c:\example\result.zip";
                string extractPath = @"c:\example\extract";
    
                ZipFile.CreateFromDirectory(startPath, zipPath, CompressionLevel.Fastest, true);
    
                ZipFile.ExtractToDirectory(zipPath, extractPath);
            }
        }
    }
    

    Of course this will only work if you are creating new Zips based on a given directory.

    As per the comment, the previous solution does not preserve the directory structure. If that is needed, then the following code might address that:

        var InputDirectory = @"c:\example\start";
        var OutputFilename = @"c:\example\result.zip";
        using (Stream zipStream = new FileStream(Path.GetFullPath(OutputFilename), FileMode.Create, FileAccess.Write))
        using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create))
        {
            foreach(var filePath in System.IO.Directory.GetFiles(InputDirectory,"*.*",System.IO.SearchOption.AllDirectories))
            {
                var relativePath = filePath.Replace(InputDirectory,string.Empty);
                using (Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                using (Stream fileStreamInZip = archive.CreateEntry(relativePath).Open())
                    fileStream.CopyTo(fileStreamInZip);
            }
        }
    

提交回复
热议问题