Files CRUD
file.ts
import fs from 'node:fs/promises'
await fs.readFile('file.txt', 'utf8')
await fs.writeFile('file.txt', 'data')
await fs.appendFile('file.txt', 'more')
await fs.copyFile('src.txt', 'dest.txt')
await fs.rename('old.txt', 'new.txt')
await fs.rm('file.txt')
,
import fs from 'node:fs/promises'
await fs.readFile('file.txt', 'utf8')
await fs.writeFile('file.txt', 'data')
await fs.appendFile('file.txt', 'more')
await fs.copyFile('src.txt', 'dest.txt')
await fs.rename('old.txt', 'new.txt')
await fs.rm('file.txt')
Directory walk
import {readdir} from 'node:fs/promises'
import {join} from 'node:path'
async function* walk(dir) {
for (const entry of await readdir(dir, {withFileTypes: true})) {
const res = join(dir, entry.name)
if (entry.isDirectory()) yield* walk(res)
else yield res
}
}
for await (const file of walk('src')) console.log(file)
Large-file streams createReadStream
createReadStream
import {createReadStream} from 'node:fs'
import readline from 'node:readline'
const rl = readline.createInterface({input: createReadStream('large.log')})
for await (const line of rl) {
// do something with each line
}
unzip archives
import fs from 'node:fs'
import unzipper from 'unzipper'
export function unzip(archivePath: string, dest = './out'): Promise<void> {
return fs
.createReadStream(archivePath)
.pipe(unzipper.Extract({path: dest}))
.promise() // unzipper adds a neat promise helper
}
ZIP with exclude
import fs from 'node:fs'
import archiver from 'archiver'
export async function zipDir(src: string, out = 'archive.zip'): Promise<void> {
return new Promise((resolve, reject) => {
const output = fs.createWriteStream(out)
const archive = archiver('zip', {zlib: {level: 9}})
output.on('close', resolve)
archive.on('error', reject)
archive.pipe(output)
// include only .js/.ts/.json, skip maps, dot-files, node_modules
archive.glob('**/*.{js,ts,json}', {
cwd: src,
ignore: ['node_modules/**', '**/*.map', '**/.*']
})
archive.finalize()
})
}
Directories CRUD
import fs from 'node:fs/promises'
await fs.mkdir('dir', {recursive: true})
await fs.rmdir('dir')
await fs.rm('dir', {recursive: true})
await fs.readdir('dir') // return files
await fs.cp('src/', 'dest/', {recursive: true}) // copy
Glob
import fg from 'fast-glob' // external dependency
const files = await fg('**/*.js', {cwd: 'src'})
GZIP file
import {createReadStream, createWriteStream} from 'node:fs'
import {createGzip} from 'node:zlib'
createReadStream('data.json').pipe(createGzip()).pipe(createWriteStream('data.json.gz'))
import archiver from 'archiver'
import {createWriteStream} from 'node:fs'
const output = createWriteStream('site.zip')
const archive = archiver('zip', {zlib: {level: 9}})
archive.pipe(output)
archive.directory('public/', false)
await archive.finalize()