Nodejs filesystem

From wikinotes

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.html

There 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 file

promise/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()s

callback 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 the options 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)
// ..