Nodejs filesystem: Difference between revisions
From wikinotes
(17 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
= Documentation = | |||
<blockquote> | |||
{| class="wikitable" | |||
|- | |||
| path docs || https://nodejs.org/api/path.html | |||
|- | |||
| fs docs || https://nodejs.org/api/fs.html | |||
|- | |||
|} | |||
</blockquote><!-- Documentation --> | |||
= filepaths = | = filepaths = | ||
Line 12: | Line 23: | ||
// nodejs does not expand ~ | // nodejs does not expand ~ | ||
// so replace it with the envvar | // so replace it with the envvar or os.homedir() | ||
'~/.zshrc'.replace('~', process.env.HOME) | '~/.zshrc'.replace('~', process.env.HOME) | ||
'~/.zshrc'.replace('~', os.homedir()) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- filepaths --> | </blockquote><!-- filepaths --> | ||
Line 22: | Line 34: | ||
See https://nodejs.org/api/fs.html | See https://nodejs.org/api/fs.html | ||
There are 2x separate APIs for interacting with files. | There are 2x separate APIs for interacting with files,<br> | ||
and several ''common object'' classes used in return values etc. | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
// APIs | |||
const fs = require('fs/promises'); // async/promise based | const fs = require('fs/promises'); // async/promise based | ||
const fs = require('fs'); // callback based | const fs = require('fs'); // callback based | ||
// Common Objects | |||
fs.Dir // a directory | |||
fs.Dirent // a file/directory inside a parent dir | |||
fs.Stats // size, filetype info, last modified, permissions | |||
fs.ReadStream / fs.WriteStream // stream io | |||
fs.FSWatcher / fs.StatWatcher // fs.watch()/fs.watchFile watch a file | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== promise | == promise/callback APIs == | ||
<blockquote> | <blockquote> | ||
promise api | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
const fs = require('fs/promises'); | const fs = require('fs/promises'); | ||
// | await fs.rename('/var/tmp/foo.txt', '/var/tmp/bar.txt') | ||
// most functions do not have return values, enabling chaining .then()s | |||
</syntaxhighlight> | |||
callback api | |||
<syntaxhighlight lang="javascript"> | |||
const fs = require('fs'); | |||
fs.rename('/var/tmp/foo.txt', '/var/tmp/bar.txt', | |||
(err) => { | |||
if (err) throw err; | |||
console.log('success'); | |||
} | |||
); | |||
</syntaxhighlight> | |||
</blockquote><!-- Promise/Callback APIs --> | |||
== manipulating files == | |||
<blockquote> | |||
<syntaxhighlight lang="javascript"> | |||
// test files, list dirs | |||
fs.existSync('/var/tmp/dir') // true | |||
fs.readdirSync('/var/tmp/dir') // ['foo.txt', 'bar.txt'] | |||
// remove file | |||
fs.rmdir('/var/foo', { recursive: true, force: true }) | |||
fs.rmdirSync('/var/foo') | |||
// recursively delete directory/children | |||
// move file | |||
fs.rename('/var/foo', '/var/bar') | |||
// | // create directory | ||
fs. | fs.mkdir('/var/tmp/dir') | ||
fs.mkdirSync('/var/tmp/dir') | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- | </blockquote><!-- manipulating files --> | ||
== | == opening/writing files == | ||
<blockquote> | <blockquote> | ||
The file open modes are provided using the <code>flag</code> key in the <code>options</code> hash.<br> | |||
Alternatively, you may be interested in [[nodejs streams]]. | |||
<syntaxhighlight lang="javascript"> | |||
/* a: append | |||
* w: write/replace | |||
* r: read | |||
* | |||
* appending '+' to any mode means read/write (ex: w+,r+,a+) | |||
*/ | |||
const fs = require('fs'); | |||
fs.writeFileSync('/var/tmp/foo.txt', 'content', { flag: 'a' }) | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
const fs = require('fs'); | const fs = require('fs'); | ||
const pfs = require('fs/promises'); | |||
const contents = 'abc\ndef'; | const contents = 'abc\ndef'; | ||
// synchronous | |||
fs.writeFileSync('/var/tmp/foo.txt', contents) | |||
// async, callback based | // async, callback based | ||
fs.writeFile('/var/tmp/foo.txt', contents, err => { | fs.writeFile( | ||
'/var/tmp/foo.txt', | |||
contents, | |||
err => { if (err) { console.log(err); }, | |||
}) | }) | ||
// | // promise-based | ||
fs. | pfs. | ||
</syntaxhighlight> | |||
</blockquote><!-- opening files --> | |||
== file info == | |||
<blockquote> | |||
<syntaxhighlight lang="javascript"> | |||
const fs = require('fs/promises'); | |||
await let info = fs.stat('foo.txt') | |||
// .. info.size | |||
// .. info.uid | |||
// .. info.mode (BigInt, convert to octal) | |||
// .. | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- | </blockquote><!-- file info --> | ||
</blockquote><!-- filesystem --> | </blockquote><!-- filesystem --> |
Latest revision as of 02:44, 6 August 2021
Documentation
path docs https://nodejs.org/api/path.html fs docs https://nodejs.org/api/fs.html
filepaths
See https://nodejs.org/api/path.html
const path = require('path'); const filepath = path.resolve('foo.txt') // relative to abspath path.dirname(filepath) // '/home/you' path.basename(filepath) // 'foo.txt' path.extname(filepath) // '.txt' // nodejs does not expand ~ // so replace it with the envvar or os.homedir() '~/.zshrc'.replace('~', process.env.HOME) '~/.zshrc'.replace('~', os.homedir())
filesystem
Use the filesystem module to interact with files (read, write, size, ..).
See https://nodejs.org/api/fs.htmlThere are 2x separate APIs for interacting with files,
and several common object classes used in return values etc.// APIs const fs = require('fs/promises'); // async/promise based const fs = require('fs'); // callback based // Common Objects fs.Dir // a directory fs.Dirent // a file/directory inside a parent dir fs.Stats // size, filetype info, last modified, permissions fs.ReadStream / fs.WriteStream // stream io fs.FSWatcher / fs.StatWatcher // fs.watch()/fs.watchFile watch a filepromise/callback APIs
promise api
const fs = require('fs/promises'); await fs.rename('/var/tmp/foo.txt', '/var/tmp/bar.txt') // most functions do not have return values, enabling chaining .then()scallback api
const fs = require('fs'); fs.rename('/var/tmp/foo.txt', '/var/tmp/bar.txt', (err) => { if (err) throw err; console.log('success'); } );manipulating files
// test files, list dirs fs.existSync('/var/tmp/dir') // true fs.readdirSync('/var/tmp/dir') // ['foo.txt', 'bar.txt'] // remove file fs.rmdir('/var/foo', { recursive: true, force: true }) fs.rmdirSync('/var/foo') // recursively delete directory/children // move file fs.rename('/var/foo', '/var/bar') // create directory fs.mkdir('/var/tmp/dir') fs.mkdirSync('/var/tmp/dir')opening/writing files
The file open modes are provided using the
flag
key in theoptions
hash.
Alternatively, you may be interested in nodejs streams./* a: append * w: write/replace * r: read * * appending '+' to any mode means read/write (ex: w+,r+,a+) */ const fs = require('fs'); fs.writeFileSync('/var/tmp/foo.txt', 'content', { flag: 'a' })const fs = require('fs'); const pfs = require('fs/promises'); const contents = 'abc\ndef'; // synchronous fs.writeFileSync('/var/tmp/foo.txt', contents) // async, callback based fs.writeFile( '/var/tmp/foo.txt', contents, err => { if (err) { console.log(err); }, }) // promise-based pfs.file info
const fs = require('fs/promises'); await let info = fs.stat('foo.txt') // .. info.size // .. info.uid // .. info.mode (BigInt, convert to octal) // ..