DotNetZip: How to extract files, but ignoring the path in the zipfile?

22,939

Solution 1

You'll need to remove the directory part of the filename just prior to unzipping...

using (var zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ToList().ForEach(entry =>
    {
        entry.FileName = System.IO.Path.GetFileName(entry.FileName);
        entry.Extract(appPath);
    });
}

Solution 2

While you can't specify it for a specific call to Extract() or ExtractAll(), the ZipFile class has a FlattenFoldersOnExtract field. When set to true, it flattens all the extracted files into one folder:

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract;
zip.FlattenFoldersOnExtract = true;
zip.ExtractAll();
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;

Solution 3

You can use the overload that takes a stream as a parameter. In this way you have full control of path where the files will be extracted to.

Example:

using (ZipFile zip = new ZipFile(ZipPath))
{
     foreach (ZipEntry e in zip)
     {
        string newPath = Path.Combine(FolderToExtractTo, e.FileName);

        if (e.IsDirectory)
        {
           Directory.CreateDirectory(newPath);
        }
        else
        {
          using (FileStream stream = new FileStream(newPath, FileMode.Create))
             e.Extract(stream);
        }
     }
}

Solution 4

That will fail if there are 2 files with equal filenames. For example files\additionalfiles\file1.txt temp\file1.txt

First file will be renamed to file1.txt in the zip file and when the second file is trying to be renamed an exception is thrown saying that an item with the same key already exists

Share:
22,939
Kumar
Author by

Kumar

Updated on July 22, 2022

Comments

  • Kumar
    Kumar almost 2 years

    Trying to extract files to a given folder ignoring the path in the zipfile but there doesn't seem to be a way.

    This seems a fairly basic requirement given all the other good stuff implemented in there.

    What am i missing ?

    code is -

    using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
    {
        zf.ExtractAll(appPath);
    }
    
  • Eric Bole-Feysot
    Eric Bole-Feysot over 10 years
    This should be the accepted answer (DontNetZip doc). The other answer is a workaround: it renames the file inside the zip before extracting it.
  • Joel Peltonen
    Joel Peltonen over 9 years
    Why zf.ToList().ForEach(entry => {...}) instead of foreach (var entry in zf.Entries){}? Is there some difference?
  • Rado
    Rado almost 5 years
    Thanks, this worked! I kept getting "An item with the same key has already been added" errors with the one marked as answer (maybe an error on my part, but anyway).