Node.js: fs模块详解

lxf2023-05-17 01:28:53

文件写入

基本使用

异步写入————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文件是相对于那个目录创建的

Node.js: fs模块详解

__dirname: 当前文件所在的文件夹的绝对路径

__filename: 当前文件的绝对路径

没有进行path.resolve处理前

fs.writeFileSync( __dirname + '/index.js', '')

Node.js: fs模块详解

path.resolve: 拼接规范的绝对路径

处理后

console.log(path.resolve(__dirname + './01_path.resolve.js'))

Node.js: fs模块详解 这样设置后在任何其他命令行工作目录执行代码, 代码执行后都可以找到正确的路径

extname: 获取文件扩展名

console.log(path.extname(__filename))
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!