diff --git a/.travis.yml b/.travis.yml index e9cca96..5f9afb8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,3 +3,7 @@ node_js: - '6' - '8' - node +os: + - windows + - osx + - linux diff --git a/index.js b/index.js index c9ea2dd..48fd671 100644 --- a/index.js +++ b/index.js @@ -144,13 +144,25 @@ function open (self, mode, req) { function onopen (err, fd) { if (err) return req.callback(err) - var old = self.fd self.fd = fd - if (!old) return oncloseoldfd(null) - // if we are moving from readonly -> readwrite, close the old fd - fs.close(old, oncloseoldfd) + // fs.open on Linux fails with an error on a directory, but on Windows it + // returns a file descriptor to the dir, which we don't want. + // https://nodejs.org/api/fs.html#fs_file_system_flags + fs.fstat(fd, function (err, stats) { + if (err) return onerrorafteropen(err) + if (stats.isDirectory()) { + var error = new Error('EISDIR: illegal operation on a directory, open \'' + self.filename + '\'') + error.code = 'EISDIR' + return onerrorafteropen(error) + } + + if (!old) return oncloseoldfd(null) + + // if we are moving from readonly -> readwrite, close the old fd + fs.close(old, oncloseoldfd) + }) } function oncloseoldfd (err) { diff --git a/test.js b/test.js index 4183ff2..fd2b87e 100644 --- a/test.js +++ b/test.js @@ -170,6 +170,28 @@ tape('write/read big chunks', function (t) { } }) +tape('destroy', function (t) { + var name = gen() + var file = raf(name) + + file.write(0, Buffer.from('hi'), function (err) { + t.error(err, 'no error') + file.read(0, 2, function (err, buf) { + t.error(err, 'no error') + t.same(buf, Buffer.from('hi')) + file.destroy(ondestroy) + }) + }) + + function ondestroy (err) { + t.error(err, 'no error') + fs.stat(name, function (err) { + t.same(err && err.code, 'ENOENT', 'should be removed') + t.end() + }) + } +}) + tape('rmdir option', function (t) { var name = path.join('rmdir', ++i + '', 'folder', 'test.txt') var file = raf(name, {rmdir: true, directory: tmp})