max-mapper / extract-zip

Zip extraction written in pure JavaScript. Extracts a zip into a directory.
BSD 2-Clause "Simplified" License
391 stars 127 forks source link

Error: EISDIR: illegal operation on a directory #24

Open mh-cbon opened 8 years ago

mh-cbon commented 8 years ago

Hi,

I m getting an error while extracting a zip file, probably made on windows, i m unsure as it s not mine, but believe so as it s about a windows binary.

The file seems not corrupted as i can unzip it with gnome unzip app.

Please see the debug output, and a test code to reproduce the error,

File downloaded at /home/mh-cbon/projects/nssm-prebuilt/dl.zip
Unzipping to /home/mh-cbon/projects/nssm-prebuilt/prebuilt
  extract-zip creating target directory +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt
  extract-zip opening +2ms /home/mh-cbon/projects/nssm-prebuilt/dl.zip with opts { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt' }
  extract-zip zipfile entry +6ms nssm-2.24/
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/', isDir: true, isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/' }
  extract-zip finished processing +1ms nssm-2.24/
  extract-zip zipfile entry +1ms nssm-2.24/ChangeLog.txt
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/ChangeLog.txt',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/ChangeLog.txt
  extract-zip finished processing +11ms nssm-2.24/ChangeLog.txt
  extract-zip zipfile entry +0ms nssm-2.24/README.txt
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/README.txt',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/README.txt
  extract-zip finished processing +2ms nssm-2.24/README.txt
  extract-zip zipfile entry +0ms nssm-2.24/src/
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/', isDir: true, isSymlink: false }
  extract-zip mkdirp +1ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/' }
  extract-zip finished processing +0ms nssm-2.24/src/
  extract-zip zipfile entry +0ms nssm-2.24/src/account.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/account.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/account.cpp
  extract-zip finished processing +1ms nssm-2.24/src/account.cpp
  extract-zip zipfile entry +1ms nssm-2.24/src/account.h
  extract-zip extracting entry +1ms { filename: 'nssm-2.24/src/account.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/account.h
  extract-zip finished processing +2ms nssm-2.24/src/account.h
  extract-zip zipfile entry +1ms nssm-2.24/src/console.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/console.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/console.cpp
  extract-zip finished processing +0ms nssm-2.24/src/console.cpp
  extract-zip zipfile entry +1ms nssm-2.24/src/console.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/console.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +1ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/console.h
  extract-zip finished processing +1ms nssm-2.24/src/console.h
  extract-zip zipfile entry +1ms nssm-2.24/src/env.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/env.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/env.cpp
  extract-zip finished processing +1ms nssm-2.24/src/env.cpp
  extract-zip zipfile entry +1ms nssm-2.24/src/env.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/env.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/env.h
  extract-zip finished processing +2ms nssm-2.24/src/env.h
  extract-zip zipfile entry +0ms nssm-2.24/src/event.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/event.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/event.cpp
  extract-zip finished processing +0ms nssm-2.24/src/event.cpp
  extract-zip zipfile entry +0ms nssm-2.24/src/event.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/event.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/event.h
  extract-zip finished processing +0ms nssm-2.24/src/event.h
  extract-zip zipfile entry +0ms nssm-2.24/src/gui.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/gui.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/gui.cpp
  extract-zip finished processing +0ms nssm-2.24/src/gui.cpp
  extract-zip zipfile entry +1ms nssm-2.24/src/gui.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/gui.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +1ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/gui.h
  extract-zip finished processing +0ms nssm-2.24/src/gui.h
  extract-zip zipfile entry +1ms nssm-2.24/src/imports.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/imports.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/imports.cpp
  extract-zip finished processing +1ms nssm-2.24/src/imports.cpp
  extract-zip zipfile entry +1ms nssm-2.24/src/imports.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/imports.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/imports.h
  extract-zip finished processing +1ms nssm-2.24/src/imports.h
  extract-zip zipfile entry +3ms nssm-2.24/src/io.cpp
  extract-zip extracting entry +1ms { filename: 'nssm-2.24/src/io.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +1ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +2ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/io.cpp
  extract-zip finished processing +3ms nssm-2.24/src/io.cpp
  extract-zip zipfile entry +0ms nssm-2.24/src/io.h
  extract-zip extracting entry +1ms { filename: 'nssm-2.24/src/io.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/io.h
  extract-zip finished processing +1ms nssm-2.24/src/io.h
  extract-zip zipfile entry +1ms nssm-2.24/src/messages.mc
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/messages.mc',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/messages.mc
  extract-zip finished processing +5ms nssm-2.24/src/messages.mc
  extract-zip zipfile entry +0ms nssm-2.24/src/nssm.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/nssm.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +1ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/nssm.cpp
  extract-zip finished processing +1ms nssm-2.24/src/nssm.cpp
  extract-zip zipfile entry +0ms nssm-2.24/src/nssm.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/nssm.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/nssm.h
  extract-zip finished processing +0ms nssm-2.24/src/nssm.h
  extract-zip zipfile entry +0ms nssm-2.24/src/nssm.ico
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/nssm.ico',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +1ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/nssm.ico
  extract-zip finished processing +1ms nssm-2.24/src/nssm.ico
  extract-zip zipfile entry +1ms nssm-2.24/src/nssm.rc
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/nssm.rc',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/nssm.rc
  extract-zip finished processing +2ms nssm-2.24/src/nssm.rc
  extract-zip zipfile entry +0ms nssm-2.24/src/nssm.sln
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/nssm.sln',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/nssm.sln
  extract-zip finished processing +2ms nssm-2.24/src/nssm.sln
  extract-zip zipfile entry +1ms nssm-2.24/src/nssm.vcproj
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/nssm.vcproj',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/nssm.vcproj
  extract-zip finished processing +1ms nssm-2.24/src/nssm.vcproj
  extract-zip zipfile entry +0ms nssm-2.24/src/process.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/process.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/process.cpp
  extract-zip finished processing +1ms nssm-2.24/src/process.cpp
  extract-zip zipfile entry +0ms nssm-2.24/src/process.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/process.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/process.h
  extract-zip finished processing +0ms nssm-2.24/src/process.h
  extract-zip zipfile entry +1ms nssm-2.24/src/registry.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/registry.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/registry.cpp
  extract-zip finished processing +1ms nssm-2.24/src/registry.cpp
  extract-zip zipfile entry +0ms nssm-2.24/src/registry.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/registry.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/registry.h
  extract-zip finished processing +0ms nssm-2.24/src/registry.h
  extract-zip zipfile entry +1ms nssm-2.24/src/resource.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/resource.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/resource.h
  extract-zip finished processing +0ms nssm-2.24/src/resource.h
  extract-zip zipfile entry +0ms nssm-2.24/src/service.cpp
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/service.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/service.cpp
  extract-zip finished processing +1ms nssm-2.24/src/service.cpp
  extract-zip zipfile entry +1ms nssm-2.24/src/service.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/service.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/service.h
  extract-zip finished processing +3ms nssm-2.24/src/service.h
  extract-zip zipfile entry +1ms nssm-2.24/src/settings.cpp
  extract-zip extracting entry +1ms { filename: 'nssm-2.24/src/settings.cpp',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +1ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/settings.cpp
  extract-zip finished processing +1ms nssm-2.24/src/settings.cpp
  extract-zip zipfile entry +1ms nssm-2.24/src/settings.h
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/settings.h',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/settings.h
  extract-zip finished processing +1ms nssm-2.24/src/settings.h
  extract-zip zipfile entry +0ms nssm-2.24/src/version.cmd
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/src/version.cmd',
  isDir: false,
  isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/src/version.cmd
  extract-zip finished processing +0ms nssm-2.24/src/version.cmd
  extract-zip zipfile entry +1ms nssm-2.24/win32/
  extract-zip extracting entry +0ms { filename: 'nssm-2.24/win32/', isDir: false, isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24' }
  extract-zip opening read stream +0ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/
  extract-zip finished processing +0ms nssm-2.24/win32/
  extract-zip write error +1ms { error: 
   { [Error: EISDIR: illegal operation on a directory, open '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/']
     errno: -21,
     code: 'EISDIR',
     syscall: 'open',
     path: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/' } }
Error: EISDIR: illegal operation on a directory, open '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/'
    at Error (native)
/home/mh-cbon/projects/nssm-prebuilt/install.js:64
    throw err
    ^

Error: EISDIR: illegal operation on a directory, open '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/'
    at Error (native)

test code from this repo https://github.com/mh-cbon/nssm-prebuilt

var pkg         = require('./package.json')
var hyperquest  = require('hyperquest')
var extract     = require('extract-zip')
var path        = require('path');
var async       = require('async');
var fs          = require('fs');
var Spinner     = require('cli-spinner').Spinner;

var url         = pkg["x-url"] || "https://nssm.cc/release/nssm-2.24.zip";
var dlFile      = path.join(__dirname, "dl.zip")
var targetPath  = path.join(__dirname, "prebuilt")

var downloadFile = function (then) {

  fs.access(dlFile, fs.F_OK, function (err) {

    if (!err) {
      console.log("File already downloaded at %s", dlFile)
      return then()
    }

    console.log("Downloading %s to %s", url, dlFile)
    var spinner = new Spinner('please wait.. %s');
    spinner.setSpinnerString('|/-\\');
    spinner.start();

    var r = hyperquest(url);
    r.pipe(fs.createWriteStream(dlFile));
    r.on('error', function (err) {
      spinner.stop(true);
      then(err)
    })
    r.on('end', function () {
      spinner.stop(true);
      then()
    });
  });

}

var createUnzipDir = function (then) {
  fs.access(dlFile, fs.F_OK, function (err) {
    if(err) fs.mkdir(targetPath, then)
    else then()
  })
}

var unzipfile = function (then) {
  console.log("Unzipping to %s", targetPath)
  extract(dlFile, {dir: targetPath}, then)
}

async.series([
    downloadFile,
    createUnzipDir,
    unzipfile
], function (err) {
  if (err) {
    console.error(err.stack)
    throw err
  }
  console.log("All done !")
});

It seems to be related to #13

I hope you can take a moment to help me !

mh-cbon commented 8 years ago

hi @maxogden

I added some more debug to extract-zip module, to show the entry content, here is the results,

  extract-zip zipfile entry +0ms nssm-2.24/win32/
  extract-zip entry {"versionMadeBy":63,"versionNeededToExtract":20,"generalPurposeBitFlag":0,"compressionMethod":0,"lastModFileTime":33904,"lastModFileDate":17695,"crc32":0,"compressedSize":0,"uncompressedSize":0,"fileNameLength":16,"extraFieldLength":36,"fileCommentLength":0,"internalFileAttributes":0,"externalFileAttributes":48,"relativeOffsetOfLocalHeader":121948,"fileName":"nssm-2.24/win32/","extraFields":[{"id":10,"data":{"type":"Buffer","data":[0,0,0,0,1,0,24,0,40,138,64,50,49,197,207,1,40,138,64,50,49,197,207,1,40,138,64,50,49,197,207,1]}}],"fileComment":""} +0ms

  extract-zip extracting entry +0ms { filename: 'nssm-2.24/win32/', isDir: false, isSymlink: false }
  extract-zip mkdirp +0ms { dir: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24' }
  extract-zip opening read stream +1ms /home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/
  extract-zip finished processing +0ms nssm-2.24/win32/
  extract-zip write error +0ms { error: 
   { [Error: EISDIR: illegal operation on a directory, open '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/']
     errno: -21,
     code: 'EISDIR',
     syscall: 'open',
     path: '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/' } }
Error: EISDIR: illegal operation on a directory, open '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/'
    at Error (native)
/home/mh-cbon/projects/nssm-prebuilt/install.js:68
        throw err
        ^

Error: EISDIR: illegal operation on a directory, open '/home/mh-cbon/projects/nssm-prebuilt/prebuilt/nssm-2.24/win32/'
    at Error (native)

hope this can help!

mh-cbon commented 8 years ago

IMHO, i tracked the problem to this condition if (!isDir) isDir = (madeBy === 0 && entry.externalFileAttributes === 16) where externalFileAttributes

Which give me some clues about the nature of the problem, so i ll start by trying to produce buggy zip files to reproduce this behavior then let s see.

mh-cbon commented 8 years ago

Here are some tests file, based on the initial archive i wanted to unzip.

They are made of several tools and utilities available on windows to zip a folder.

The script

var extract = require('extract-zip')

extract("./nssm-2.24-windows7.zip", {dir: "./nssm-2.24-windows7"}, function (err) {
 // extraction is complete. make sure to handle the err
})

extract("./nssm-2.24-7zip.zip", {dir: "./nssm-2.24-7zip"}, function (err) {
 // extraction is complete. make sure to handle the err
})

extract("./nssm-2.24-winzip.zip", {dir: "./nssm-2.24-winzip"}, function (err) {
 // extraction is complete. make sure to handle the err
})

extract("./nssm-2.24-winrar.zip", {dir: "./nssm-2.24-winrar"}, function (err) {
 // extraction is complete. make sure to handle the err
})

nssm-2.24-7zip.zip nssm-2.24-windows7.zip nssm-2.24-winrar.zip nssm-2.24-winzip.zip

Unfortunately they all fail to extract the files entirely. They all bug on the same file : /

max-mapper commented 8 years ago

@mh-cbon awesome work so far. I wonder if there are other unzip implementations on github that deal with these externalFileAttributes. Also I may not have time to dive into this issue soon, but if you figure it out please do send a PR