Home > Software engineering >  Spanned archives with more than 65534 segments are not supported at this time
Spanned archives with more than 65534 segments are not supported at this time

Time:12-15

Our current implementation on our ASP.net website doesn't support Zip64 which it needs to, so we're moving from System.IO.Compression over to DotNetZip:
https://github.com/DinoChiesa/DotNetZip

This small archive:
https://github.com/DinoChiesa/DotNetZip/files/10184907/Zip.zip

Throws the error:

Spanned archives with more than 65534 segments are not supported at this time.

The code sample simply attempts to open the Zip file:

using (var data = new MemoryStream(fileBytes.ToArray()))
{
    using (var archive = Ionic.Zip.ZipFile.Read(data))
    {
        ....
    }

I'm a little unsure what the issue is here, is there an easy workaround or is there a better altnerative library?

CodePudding user response:

You need to understand what does mean to have spanned zip file. That means that a zip is split into more files.

The file you have linked appears not to be such file:

Archive:  Zip.zip
There is no zipfile comment.

End-of-central-directory record:
-------------------------------

  Zip archive file size:                    646370 (000000000009DCE2h)
  Actual end-cent-dir record offset:        646272 (000000000009DC80h)
  Expected end-cent-dir record offset:      646272 (000000000009DC80h)
  (based on the length of the central directory and its expected offset)

  This zipfile constitutes the sole disk of a single-part archive; its
  central directory contains 25 entries.
  The central directory is 3521 (0000000000000DC1h) bytes long,
  and its (expected) offset in bytes from the beginning of the zipfile
  is 642751 (000000000009CEBFh).
...

I think the problem is how you try to read the file with fileBytes.ToArray(). The data variable should be a filename and not fileBytes.ToArray().

If you look at the provided example, on how to read zip file, from the git you can see that on line 53 you get ZipFile zip = ZipFile.Read(args[0], options), where args[0] is a zip filename.

Here is the complete example form the git:

/ ReadZip.cs
//
// ----------------------------------------------------------------------
// Copyright (c) 2006-2009 Microsoft Corporation.  All rights reserved.
//
// This example is released under the Microsoft Public License .
// See the license.txt file accompanying this release for
// full details.
//
// ----------------------------------------------------------------------
//
// This simple example utility simply reads a zip archive and extracts
// all elements in it, to the specified target directory.
//
// compile with:
//     csc /target:exe /r:Ionic.Zip.dll /out:ReadZip.exe ReadZip.cs
//
// Wed, 29 Mar 2006  14:36
//


using System;
using Ionic.Zip;

namespace Ionic.Zip.Examples
{
    public class ReadZip
    {
        private static void Usage()
        {
            Console.WriteLine("usage:\n  ReadZip2 <zipfile> <unpackdirectory>");
            Environment.Exit(1);
        }


        public static void Main(String[] args)
        {

            if (args.Length != 2) Usage();
            if (!System.IO.File.Exists(args[0]))
            {
                Console.WriteLine("That zip file does not exist!\n");
                Usage();
            }

            try
            {
                // Specifying Console.Out here causes diagnostic msgs to be sent to the Console
                // In a WinForms or WPF or Web app, you could specify nothing, or an alternate
                // TextWriter to capture diagnostic messages.

                var options = new ReadOptions { StatusMessageWriter = System.Console.Out };
                using (ZipFile zip = ZipFile.Read(args[0], options))
                {
                    // This call to ExtractAll() assumes:
                    //   - none of the entries are password-protected.
                    //   - want to extract all entries to current working directory
                    //   - none of the files in the zip already exist in the directory;
                    //     if they do, the method will throw.
                    zip.ExtractAll(args[1]);
                }
            }
            catch (System.Exception ex1)
            {
                System.Console.Error.WriteLine("exception: "   ex1);
            }

        }
    }
}

CodePudding user response:

There is the SharpZipLib nuget package you can use as an alternative.

The code below runs successfully with input the file you posted

static void Main(string[] args)
{
    Console.WriteLine("Hello, World!");
    string filename = "../../../Zip.zip";

    FileStream fs = File.OpenRead(filename);
    ICSharpCode.SharpZipLib.Zip.ZipFile zf = new ICSharpCode.SharpZipLib.Zip.ZipFile(fs);
    foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry zipEntry in zf)
    {
        string entryFileName = zipEntry.Name;
        Console.WriteLine("File: "   entryFileName);
    }
}

Output

Hello, World!
File: scripts/c3runtime.js
File: data.json
File: style.css
File: scripts/offlineclient.js
File: images/shared-0-sheet1.png
File: images/tiledbackground-sheet0.png
File: images/shared-0-sheet0.png
File: appmanifest.json
File: scripts/main.js
File: workermain.js
File: scripts/dispatchworker.js
File: scripts/jobworker.js
File: scripts/supportcheck.js
File: icons/icon-16.png
File: icons/icon-32.png
File: icons/icon-128.png
File: icons/icon-256.png
File: icons/icon-64.png
File: icons/icon-512.png
File: icons/loading-logo.png
File: index.html
File: arcade.json
File: scripts/register-sw.js
File: sw.js
File: offline.json

P.S. I have worked with both libraries in the past and I have found that DotNetZip is easier to work with, but for this case only SharpZipLib works :).

  • Related