Node.js: fs模块详解
文件写入
基本使用
异步写入————fs.writeFile( file, data, options, callback)
同步写入————fs.writeFileSync(file, data)
file
: 要写入的文件路径及文件名。data
: 要写入的数据,可以是一个字符串或一个缓冲区对象。options
(可选): 一个对象,表示写入操作的附加选项参数,可以包含以下属性:encoding
:要使用的编码格式,默认为 'utf8'。mode
:文件的权限设置,默认为 0o666。flag
:文件打开的标志位,默认为 'w',表示覆盖写入。
callback
(可选): 回调函数,当写入操作完成时调用。err
:操作失败err为错误对象,成功err为null。
// 引入fs模块
const fs = require('fs')
fs.writeFile('desc.txt', 'hello world~', res => {
// 回调函数: 写入失败返回失败对象, 写入成功返回null
if(res) {
console.log("写入失败")
return
} else {
console.log("写入成功")
}
})
同步与异步的特点
文件的写入方式一: 异步写入(效率高)
代码执行到fs.writeFile().时, 会让i/o流线程进行文件写入, 不影响主线程代码的继续执行。当i/o流线程执行结束后会将fs.writeFile().中的回调函数压入信息队列中, 当主线程的代码执行结束后再从队列中取出回调函数执行。
文件的写入方式一: 同步写入
与异步不同的地方就是主线程需要等待i/o线程执行结束后再往下执行, 因此同步写入方式没有回调函数。
追加写入
各个参数以及含义与fs.writeFile相同。
fs.appendFile()
fs.appendFileSync()
流式写入
应用场景: 流式写入适用于频繁写入数据的场景。
// 导入fs
const fs = require('fs')
// 创建写入流对象
const ws = fs.createWriteStream('./city.txt')
// 写入文件
ws.write('北京')
// 关闭写入流(可以不用手动关闭: 代码执行结束后自动关闭)
ws.close()
文件读取
基本使用
异步读取————fs.readFile(path, options, callback)
异步读取————const data = fs.readFile(path), 返回值为data
path
:要读取的文件路径及文件名。options
(可选):一个对象,表示读取操作的附加选项参数,可以包含以下属性:flag
:打开文件时要使用的标志,例如 'r' 表示以只读方式打开文件,默认为 'r'。encoding
:文件的编码格式,默认为 null。
callback
:回调函数,当读取操作完成时调用。该函数接受两个参数:err
:操作失败err为错误对象,成功err为null。data
:表示读取到的文件内容,如果出现错误,则该值为 undefined。
流式读取
const fs = require('fs')
// 创建读取流对象
const rs = fs.createReadStream('./desc.txt')
// 绑定data事件读取数据, 每读取一次把数据传给chunk并回调一次函数,
//每一次读取的buffer大小为65536byte, 也就是64k。流式读取每一次最多读取64kb大小的数据直到读取结束
rs.on('data', chunk => {
console.log(chunk.toString())
console.log(chunk.length)
})
// 读取结束后触发end事件, 可选事件
rs.on('end', () => {
console.log('读取完成~')
})
文件删除
方式二: fs.unlink(path, callback)
方式一: fs.rm(path, callback)-推荐使用
fs.rm('./city.txt', err => {
if(err) {
console.log("删除失败")
} else {
console.log("删除成功")
}
})
文件重命名与移动
异步操作————fs.rename(oldpath, newpath, callback)
同步操作————fs.renameSync(oldpath, newpath)
oldPath
:要重命名或移动的文件路径及文件名。newPath
:表示重命名或移动后的文件路径及文件名。callback
:回调函数,当重命名或移动操作完成时调用。该函数接受一个可能的错误参数。
fs.rename('./我与地坛节选.txt', '../邂逅node.js/我与地坛节选.txt', err => {
if(err) {
console.log("操作失败~")
} else {
console.log("操作成功")
}
})
文件夹相关操作
创建和链式创建
异步: fs.mkdir(path, options, callback)
同步: fs.mkdirSync(path, options)
fs.mkdir('../src', err => {
if(err) {
console.log("操作失败")
} else {
console.log("操作成功")
}
})
链式创建
{ recursive: true }
是一个附加选项,用于创建或删除多级嵌套目录。
fs.mkdir('../src/a/b', {recursive: true}, err => {
if(err) {
console.log("操作失败")
} else {
console.log("操作成功")
}
})
读取
异步: fs.readdir(path, options, callback)
同步: fs.readdirSync(path, options)
fs.readdir('./', (err, data) => {
if(err) {
console.log("操作失败")
} else {
console.log("操作成功")
console.log(data)
}
})
删除和链式删除
异步: fs.rmdir(path, options, callback)
同步: fs.rmdirSync(path, options)
链式删除
fs.rmdir('../src', {recursive: true}, err => {
if(err) {
console.log("操作失败")
} else {
console.log("操作成功")
}
})
推荐删除方法fs.rm
fs.rm('../src', {recursive: true}, err => {
if(err) {
console.log("操作失败")
} else {
console.log("操作成功")
}
})
fs路径问题
相对路径
fs.writeFileSync('./index.js', '')
fs.writeFileSync('index.js', '')
绝对路径
fs.writeFileSync('/index.js', '')
fs.writeFileSync('D: /index.js', '')
注意事项
相对路径的参照对象是命令行的工作目录: 所以在其他命令行工作目录运行代码时会出现问题: 比如fs.writeFileSync('./index.js', '')的其实是相对于命令行工作目录的, 命令行工作目录在哪儿, 创建的index文件是相对于那个目录创建的
__dirname: 当前文件所在的文件夹的绝对路径
__filename: 当前文件的绝对路径
没有进行path.resolve处理前
fs.writeFileSync( __dirname + '/index.js', '')
path.resolve: 拼接规范的绝对路径
处理后
console.log(path.resolve(__dirname + './01_path.resolve.js'))
这样设置后在任何其他命令行工作目录执行代码, 代码执行后都可以找到正确的路径
extname: 获取文件扩展名
console.log(path.extname(__filename))
转载自:https://juejin.cn/post/7233589699214852157