You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

322 lines
8.0 KiB

13 years ago
Node.js: fs-extra
=================
13 years ago
12 years ago
[![build status](https://secure.travis-ci.org/jprichardson/node-fs-extra.png)](http://travis-ci.org/jprichardson/node-fs-extra)
13 years ago
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`.
13 years ago
Why?
----
I got tired of including `mkdirp`, `rimraf`, and `cp -r` in most of my projects.
Installation
------------
12 years ago
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`.
12 years ago
You don't ever need to include the original `fs` module again:
```javascript
var fs = require('fs') //this is no longer necessary
```
you can now do this:
12 years ago
```javascript
11 years ago
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:
```javascript
//var fs = require('fs')
var fse = require('fs-extra')
```
11 years ago
you can also keep, both, but it's redundant:
```javascript
var fs = require('fs')
, fse = require('fs-extra')
```
13 years ago
Methods
-------
**NOTE:** You can still use the native Node.js methods. They are copied over to `fs-extra`.
### copy(src, dest, callback)
13 years ago
Copy a file or directory. The directory can have contents. Like `cp -r`. There isn't a synchronous version implemented yet.
11 years ago
Sync: `copySync()`
13 years ago
Examples:
13 years ago
```javascript
13 years ago
var fs = require('fs-extra');
fs.copy('/tmp/myfile', '/tmp/mynewfile', function(err){
if (err) return console.error(err);
console.log("success!")
13 years ago
}); //copies file
fs.copy('/tmp/mydir', '/tmp/mynewdir', function(err){
if (err) return console.error(err);
console.log("success!")
13 years ago
}); //copies directory, even if it has subdirectories or files
```
13 years ago
### 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**.
13 years ago
Sync: `createFileSync()`
13 years ago
Example:
13 years ago
```javascript
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
})
```
13 years ago
13 years ago
### mkdirs(dir, callback)
13 years ago
Creates a directory. If the parent hierarchy doesn't exist, it's created. Like `mkdir -p`.
Alias: `mkdirp()`
Sync: `mkdirsSync()` / `mkdirpSync()`
13 years ago
Examples:
```javascript
12 years ago
var fs = require('fs-extra');
13 years ago
12 years ago
fs.mkdirs('/tmp/some/long/path/that/prob/doesnt/exist', function(err){
if (err) return console.error(err);
console.log("success!")
13 years ago
});
12 years ago
fs.mkdirsSync('/tmp/another/path');
13 years ago
```
13 years ago
### outputFile(file, data, callback)
Almost the same as `writeFile`, except that if the directory does not exist, it's created.
Sync: `outputFileSync()`
Example:
```javascript
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:
```javascript
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, callback)
Reads a JSON file and then parses it into an object.
Alias: `readJSON()`
Sync: `readJsonSync()`, `readJSONSync()`
Example:
```javascript
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:
```javascript
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, callback)
Writes an object to a JSON file.
Alias: `writeJSON()`
Sync: `writeJsonSync()`, `writeJSONSync()`
Example:
```javascript
var fs = require('fs-extra');
fs.writeJson('./package.json', {name: 'fs-extra'}, function(err){
console.log(err);
});
```
12 years ago
Roadmap to 1.0.0
-----------------
This contains items that I'm considering doing. I'd love community feedback.
11 years ago
* 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
11 years ago
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.)
13 years ago
13 years ago
Naming
------
11 years ago
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:
* https://github.com/jprichardson/node-fs-extra/issues/2
* https://github.com/flatiron/utile/issues/11
* https://github.com/ryanmcgrath/wrench-js/issues/29
* https://github.com/substack/node-mkdirp/issues/17
First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) 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`?
11 years ago
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)`.
13 years ago
11 years ago
Contributions
-------------
11 years ago
If you want to contribute, please add a test if you can. Also, don't change the version in `package.json`.
### Contributors
12 years ago
- [JP Richardson](https://github.com/jprichardson)
- [Mike McNeil](https://github.com/mikermcneil)
- [Ian Crowther](https://github.com/iancrowther)
- [Stephen Mathieson](https://github.com/stephenmathieson)
11 years ago
- [Srirangan](https://github.com/Srirangan)
12 years ago
- `<your name here>`
License
-------
13 years ago
13 years ago
Licensed under MIT
13 years ago
Copyright (c) 2011-2013 JP Richardson
13 years ago
13 years ago
[1]: http://nodejs.org/docs/latest/api/fs.html
[jsonfile]: https://github.com/jprichardson/node-jsonfile