File system
该 node:fs 模块能够以模拟标准 POSIX 函数的方式与文件系统进行交互, 所有文件系统操作都具有同步、回调和基于 promise 的形式,并且可以使用 CommonJS 语法和 ES6 模块 (ESM) 进行访问。
回调示例
- 回调表单将完成回调函数作为其最后一个参数,并异步调用操作
- 回调的参数取决于方法,但第一个参数始终保留给异常。如果操作成功完成,则第一个参数为 null 或 undefined 。
js
fs.unlink('/tmp/hello', (err) => {
if(err) throw err
});
读取文件
js
// 要使用基于 promise 的 API
const fs = require('node:fs/promises')
// 要使用回调和同步 API
// const fs = require('node:fs')
// 读取文件(多种读取方法)
// 使用一种合适的即可,多种共同使用可能会存在问题,某一种读取完后自动关闭文件,后续无法操作
fs.readFile('./demo.txt', {
encoding: 'utf8'
}).then(r => {
console.log(r)
})
const fd2 = fs.open('./demo.txt')
fd2.then(async res => {
// 通过文件流读取内容,也可指定长度
const steam = res.createReadStream({ start: 0, end: 10, encoding: 'utf-8', autoClose: false })
steam.on('data', (data) => {
console.log('读取成功1:', data)
})
// 可指定读取内容
res.read({ length: 5 }).then(r => {
console.log('读取成功2:', r.buffer.toString())
})
// 读取文件全部内容
// const c = await res.readFile({encoding: 'utf-8'})
// console.log('读取成功3:', c)
// 读取文件内每一行
for await (const line of res.readLines()) {
console.log('每一行', line);
}
})
写入文件
⚠️注意:文件写入时,一定要注意操作文件的权限要可写入
js
// 要使用基于 promise 的 API
const fs = require('node:fs/promises')
// 要使用回调和同步 API
// const fs = require('node:fs')
// ⚠️注意:文件写入时,一定要注意操作文件的权限,要可写入
const fd = fs.open('./demo.txt', 'r+')
fd.then(file => {
// 文件内容写入,参数字符串
file.write('李海超').then(res => {
console.log('写入成功', res)
// 输出:{ bytesWritten: 9, buffer: '李海超' }
})
/**
* 如果对文件内进行了一次或多次 filehandle.write() 调用,然后进行了 filehandle.writeFile() 调用,
* 则数据将从write写入完成后的位置,接着写入,直到文件末尾。它并不总是从文件的开头写入。
*/
// 参数多种
file.writeFile('writeFile')
})
文件权限判断
示例检查当前目录是否可以读取和写入该文件
js
const fs = require('node:fs/promises')
// 测试用户对 path 指定的文件或目录的权限
// 参数二可选
fs.access('../nodejs', fs.constants.R_OK | fs.constants.W_OK).then(r => {
// undefined 成功后返回
console.log('权限', r)
})
追加文件内容
js
const fs = require('node:fs/promises')
// 将数据异步追加到文件,如果文件尚不存在,则创建该文件。 data 可以是字符串或Buffer
fs.appendFile('./demo.txt', 'lihaichao').then(r => {
// 成功后结果返回 undefind
console.log('追加成功', r)
})
更改文件权限
js
const fs = require('node:fs/promises')
fs.chmod('路径', '权限字符')
// 成功后返回 undefined
文件所有权
js
const fs = require('node:fs/promises')
fs.chown('路径', 'uid', 'gid')
复制文件
js
const fs = require('node:fs/promises')
// 参数一:要复制的文件
// 参数二:目标文件
// 参数三:mode 非必填
// fs.cp() 实验性,功能更全面
fs.copyFile('./demo.txt', './test.txt')
// 异步复制 demo 到 test 。默认情况下,如果它已存在, test 则被覆盖。
异步创建目录
js
const fs = require('node:fs/promises')
fs.mkdir('./demo')
打开文件
js
const fs = require('node:fs/promises')
const file = fs.open('./demo.txt', '操作权限')
// file: 文件对象,可进行文件操作
扫描文件目录
js
const fs = require('node:fs/promises')
fs.opendir('../nodejs').then(async (r) => {
for await (const dir of r) {
console.log('文件名', dir.name)
}
})
读取文件目录
js
fs.readdir('../nodejs').then(r => {
console.log('文件目录数组', r)
// [ 01-xxx.md, 02-xxx.md ]
})
文件重命名
js
fs.rename('oldPath', 'newPath')
// 成功后 undefined
删除文件目录(不是文件)
js
fs.rmdir('./demo')
删除文件
js
fs.rm('./testopy.txt')
获取文件对象
js
fs.stat('./test.txt').then(r => {
console.log(r)
/**
* Stats {
dev: 16777234,
mode: 33188,
nlink: 1,
uid: 501,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 21248084,
size: 50,
blocks: 8,
atimeMs: 1716015351797.6108,
mtimeMs: 1716012831402.8923,
ctimeMs: 1716015349968.3926,
birthtimeMs: 1715998693737.1306,
atime: 2024-05-18T06:55:51.798Z,
mtime: 2024-05-18T06:13:51.403Z,
ctime: 2024-05-18T06:55:49.968Z,
birthtime: 2024-05-18T02:18:13.737Z
}
*/
})