Search code examples
monosharpziplibfastzip

SharpZipLib's FastZip doesn't unzip directories on Mac


I'm using the following code on Mac using Mono to unzip a zip file. The zip file contains entries under directories (for example foo/bar.txt). However, in the unzipped directory, instead of creating a directory foo with a file bar.txt, FastZip creates a file foo\bar.txt. How do I get around this?

FastZip fz = new FastZip();
string filePath = @"path\to\myfile.zip";

fz.ExtractZip(filePath, @"path\to\unzip\to", null);

This creates a file foo\bar.txt in path\to\unzip\to.


Solution

  • Apparently cannot use FastZip for this case so I ended up writing my own unzipping mechanism:

    string filePath = @"path\to\myfile.zip";
    string unzipDir = @"path\to\unzip\to";
    
    using (var zipFile = new ZipFile(filePath))
    {
        foreach (var zipEntry in zipFile.OfType<ZipEntry>())
        {
            var unzipPath = Path.Combine(unzipDir, zipEntry.Name);
            var directoryPath = Path.GetDirectoryName(unzipPath);
    
            // create directory if needed
            if (directoryPath.Length > 0)
            {
                Directory.CreateDirectory(directoryPath);
            }
    
            // unzip the file
            var zipStream = zipFile.GetInputStream(zipEntry);
            var buffer = new byte[4096];
    
            using (var unzippedFileStream = File.Create(unzipPath))
            {
                StreamUtils.Copy(zipStream, unzippedFileStream, buffer);
            }
        }
    }