Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

node-fs-extra

henrytao-me21.9k0.8.2

fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as mkdir -p, cp -r, and rm -rf.

fs, file, file system, copy, directory, extra, mkdirp, mkdir, mkdirs, recursive, json, read, write, extra, delete, remove, touch, create, text, output

readme

Node.js: fs-extra

build status

This module adds a few extra file system methods that aren't included in the native fs module. It is a drop in replacement for fs.

Why?

I got tired of including mkdirp, rimraf, and cp -r in most of my projects.

Installation

npm install --save fs-extra

Usage

fs-extra is a drop in replacement for native fs. All methods in fs are unmodified and attached to fs-extra.

You don't ever need to include the original fs module again:

var fs = require('fs') //this is no longer necessary

you can now do this:

var fs = require('fs-extra'); //var fs = require('fs')

or if you prefer to make it clear that you're using fs-extra and not fs, you may want to do this:

//var fs = require('fs')
var fse = require('fs-extra')

you can also keep, both, but it's redundant:

var fs = require('fs')
  , fse = require('fs-extra')

Methods

NOTE: You can still use the native Node.js methods. They are copied over to fs-extra.

copy(src, dest, [filter], callback)

Copy a file or directory. The directory can have contents. Like cp -r.

Sync: copySync()

Examples:

var fs = require('fs-extra');

fs.copy('/tmp/myfile', '/tmp/mynewfile', function(err){
  if (err) return console.error(err);

  console.log("success!")
}); //copies file

fs.copy('/tmp/mydir', '/tmp/mynewdir', function(err){
  if (err) return console.error(err);

  console.log("success!")
}); //copies directory, even if it has subdirectories or files

createFile(file, callback)

Creates a file. If the file that is requested to be created is in directories that do not exist, these directories are created. If the file already exists, it is NOT MODIFIED.

Sync: createFileSync()

Example:

var fs = require('fs-extra')

var file = '/tmp/this/path/does/not/exist/file.txt'

fs.createFile(file, function(err) {
  console.log(err); //null
  //file has now been created, including the directory it is to be placed in
})

mkdirs(dir, callback)

Creates a directory. If the parent hierarchy doesn't exist, it's created. Like mkdir -p.

Alias: mkdirp()

Sync: mkdirsSync() / mkdirpSync()

Examples:

var fs = require('fs-extra');

fs.mkdirs('/tmp/some/long/path/that/prob/doesnt/exist', function(err){
  if (err) return console.error(err);

  console.log("success!")
});

fs.mkdirsSync('/tmp/another/path');

outputFile(file, data, callback)

Almost the same as writeFile, except that if the directory does not exist, it's created.

Sync: outputFileSync()

Example:

var fs = require('fs-extra')
var file = '/tmp/this/path/does/not/exist/file.txt'

fs.outputFile(file, 'hello!', function(err) {
  console.log(err); //null

  fs.readFile(file, 'utf8', function(err, data) {
    console.log(data); //hello!
  })
})

outputJson(file, data, callback)

Almost the same as writeJson, except that if the directory does not exist, it's created.

Alias: `outputJSON()

Sync: outputJsonSync(), outputJSONSync()

Example:

var fs = require('fs-extra')
var file = '/tmp/this/path/does/not/exist/file.txt'

fs.outputJson(file, {name: 'JP'}, function(err) {
  console.log(err); //null

  fs.readJson(file, function(err, data) {
    console.log(data.name); //'JP
  })
})

readJson(file, [options], callback)

Reads a JSON file and then parses it into an object. options are the same that you'd pass to fs.readFile.

Alias: readJSON()

Sync: readJsonSync(), readJSONSync()

Example:

var fs = require('fs-extra');

fs.readJson('./package.json', function(err, packageObj) {
  console.log(packageObj.version); //0.1.3
});

remove(dir, callback)

Removes a file or directory. The directory can have contents. Like rm -rf.

Alias: delete()

Sync: removeSync() / deleteSync()

Examples:

var fs = require('fs-extra');

fs.remove('/tmp/myfile', function(err){
  if (err) return console.error(err);

  console.log("success!")
});

fs.removeSync('/home/jprichardson'); //I just deleted my entire HOME directory. 

writeJson(file, object, [options], callback)

Writes an object to a JSON file. options are the same that you'd pass to fs.readFile.

Alias: writeJSON()

Sync: writeJsonSync(), writeJSONSync()

Example:

var fs = require('fs-extra');
fs.writeJson('./package.json', {name: 'fs-extra'}, function(err){
  console.log(err);
});

Roadmap to 1.0.0

This contains items that I'm considering doing. I'd love community feedback.

  • File system walker. I really like this one: https://github.com/daaku/nodejs-walker ... this might be adding too much. Thoughts?
  • File/directory tree watcher. There are quite a few. ... this also might be adding too much. I like this one: https://github.com/paulmillr/chokidar but I don't like that it's written in CoffeeScript. Thoughts?
  • Method to move files.
  • Thinking about moving rimraf, ncp, and mkdirps code into this library. I'd like fs-extra to be a stable library that module authors can depend upon. A bunch of other dependencies kinda sucks for modules/libraries. (I'm leaning against this now.)
  • Change documentation to use the fse prefix instead of fs. This may encourage people to start using fse as a prefix and hence make their code clearer that they're not using the native fs. I'm very undecided on this one since fs-extra is a drop in replacement for the native fs. (I'm leaning against this now.)

Naming

I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:

First, I believe that in as many cases as possible, the Node.js naming schemes should be chosen. However, there are problems with the Node.js own naming schemes.

For example, fs.readFile() and fs.readdir(): the F* is capitalized in *File and the **d is not capitalized in dir. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: fs.mkdir(), fs.rmdir(), fs.chown(), etc.

We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: cp, cp -r, mkdir -p, and rm -rf?

My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.

So, if you want to remove a file or a directory regardless of whether it has contents, just call fs.remove(path) or its alias fs.delete(path). If you want to copy a file or a directory whether it has contents, just call fs.copy(source, destination). If you want to create a directory regardless of whether its parent directories exist, just call fs.mkdirs(path) or fs.mkdirp(path).

Credit

fs-extra wouldn't be possible without using the modules from the following authors:

Contributions

If you want to contribute, please add a test. Also, don't change the version in package.json.

Contributors

License

Licensed under MIT

Copyright (c) 2011-2013 JP Richardson

changelog

0.8.1 / 2013-10-24

  • copy failed to return an error to the callback if a file doesn't exist (ulikoehler #38, #39)

0.8.0 / 2013-10-14

  • filter implemented on copy() and copySync(). (Srirangan / #36)

0.7.1 / 2013-10-12

  • copySync() implemented (Srirangan / #33)
  • updated to the latest jsonfile version 1.1.0 which gives options params for the JSON methods. Closes #32

0.7.0 / 2013-10-07

  • update readme conventions
  • copy() now works if destination directory does not exist. Closes #29

0.6.4 / 2013-09-05

  • changed homepage field in package.json to remove NPM warning

0.6.3 / 2013-06-28

  • changed JSON spacing default from 4 to 2 to follow Node conventions
  • updated jsonfile dep
  • updated rimraf dep

0.6.2 / 2013-06-28

  • added .npmignore, #25

0.6.1 / 2013-05-14

  • modified for strict mode, closes #24
  • added outputJson()/outputJsonSync(), closes #23

0.6.0 / 2013-03-18

  • removed node 0.6 support
  • added node 0.10 support
  • upgraded to latest ncp and rimraf.
  • optional graceful-fs support. Closes #17

0.5.0 / 2013-02-03

  • Removed readTextFile.
  • Renamed readJSONFile to readJSON and readJson, same with write.
  • Restructured documentation a bit. Added roadmap.

0.4.0 / 2013-01-28

  • Set default spaces in jsonfile from 4 to 2.
  • Updated testutil deps for tests.
  • Renamed touch() to createFile()
  • Added outputFile() and outputFileSync()
  • Changed creation of testing diretories so the /tmp dir is not littered.
  • Added readTextFile() and readTextFileSync().

0.3.2 / 2012-11-01

  • Added touch() and touchSync() methods.

0.3.1 / 2012-10-11

  • Fixed some stray globals.

0.3.0 / 2012-10-09

  • Removed all CoffeeScript from tests.
  • Renamed mkdir to mkdirs/mkdirp.

0.2.1 / 2012-09-11

  • Updated rimraf dep.

0.2.0 / 2012-09-10

0.1.3 / 2012-08-13

  • Added method readJSONFile.

0.1.2 / 2012-06-15

  • Bug fix: deleteSync() didn't exist.
  • Verified Node v0.8 compatibility.

0.1.1 / 2012-06-15

  • Fixed bug in remove()/delete() that wouldn't execute the function if a callback wasn't passed.

0.1.0 / 2012-05-31

  • Renamed copyFile() to copy(). copy() can now copy directories (recursively) too.
  • Renamed rmrf() to remove().
  • remove() aliased with delete().
  • Added mkdirp capabilities. Named: mkdir(). Hides Node.js native mkdir().
  • Instead of exporting the native fs module with new functions, I now copy over the native methods to a new object and export that instead.

0.0.4 / 2012-03-14

  • Removed CoffeeScript dependency

0.0.3 / 2012-01-11

  • Added methods rmrf and rmrfSync
  • Moved tests from Jasmine to Mocha