node学习笔记-fs模块和path

91 阅读3分钟

二、fs

file system 系统文件的缩写

可以实现与硬盘的交互,例如文件的创建删除、重命名、移动、文件的写入读取、文件夹相关的操作

  1. 文件写入

writeFile异步写入
writeFileSync同步写入
appendFile / appendFileSync强迫写入
createWriteStream流式写入

writeFile 异步写入

语法:fs.writeFile(文件名, 写入的数据[, 选项设置], 回调)

返回值:undefined

fs.writeFile('./01-1-test.txt', '学习fs', err => {
  // 失败 错误对象
  // 成功 null
  if (err) {
    console.log('失败')
    return
  }
  console.log('success')
})

writeFileSync 同步写入

fs.writeFileSync('./01-2-writeFileSync.txt', 'writeFileSync')

appendFile / appendFileSync 追加写入

作用是在文件尾部追加内容,与writeFile语法完全相同

返回值:两者都为undefined

const fs = require('fs')

fs.appendFile('./02-1-addendFile.txt', '\n追加写入的内容', err => {
  if (err) {
    console.log('失败')
    return
  }
  console.log('success')
})

使用writeFile也可以实现追加写入内容

第三个参数写入{flag:'a'}

fs.writeFile('./02-1-addendFile.txt', '\nwriteFile追加写入', { flag: 'a' }, err => {
  if (err) {
    console.log('失败')
    return
  }
  console.log('success')
})

createWriteStream 流式写入

语法:fs.createWriteStream(path[, oprions])

参数说明:

  path 文件路径

  options 选项配置,可选

返回值:Object

const fs = require('fs')

const date = new Date().getTime()

// 创建写入流对象
const ws = fs.createWriteStream(`./03-1-${date}.txt`)

// 写入
ws.write('第一行\n')
ws.write('第二行\n')
ws.write('第三行\n')
ws.write('第四行\n')

// 关闭写入流
ws.close()

程序打开一个文件需要消耗资源,流式写入可以减少打开关闭文件的次数

流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景

写入文件场景

文件写入在计算机中是个非常常见的操作,下面的场景都用到了文件写入

  1. 下载文件
  2. 安装软件
  3. 保存程序日志,如git
  4. 编辑器保存文件
  5. 视频录制

当需要持久化保存数据的时候,应该想到文件写入

  1. 文件读取

readFile异步读取
readFileSync同步读取
createReadStream流式读取

readFile 异步读取

语法:fs.readFile(path[, options], callback)

参数说明:

path 文件路径

options 选项配置

callback 回调函数

readFileSync 同步读取

const readFileSyncData = fs.readFileSync('./03-1-1735540856673.txt')
console.log("readFileSyncData", readFileSyncData.toString())

createReadStream 流式读取

读取文件时每次读取64kb,一块一块的读取

const fs = require('fs')

const rs = fs.createReadStream('./屏幕录制2025-01-02 09.34.52.mov')

// 绑定data事件 chunk块
rs.on('data', chunk => {
  console.log(chunk.length)  // 65536字节 => 64KB
})

rs.on('end', () => {
  console.log('over')
})

读取文件应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开软件
  • 查看图片
  • 播放视频
  • 播放音乐
  • git查看日志
  • 上传文件
  • 查看聊天记录
  1. 文件移动和重命名

fs.rename(oldPath, newPath, callback)

fs.renameSync(oldPath, newPath)

fs.rename('./07-1.js', '../移动文件.js', err => {
  if (err) {
    console.log(err)
    return
  }
  console.log('success')
})

fs.renameSync('../移动文件.js', './重命名.js')
  1. 文件删除

fs.unlink('./07-1-重命名.js', err => {
  console.log(err)
})

fs.unlinkSync('./03-1-1735540837796.txt')

fs.rm('./06-1735785828547.mp4', err => {
  console.log(err)
})

fs.rmSync('./03-1-1735540837796.txt')

node14.4版本引入的新方法: fs.rm

  1. 文件夹操作

mkdir / mkdirSync创建
readdir / readdirSync读取
rmdir / rmdirSync删除

mkdir / mkdirSync 创建

fs.mkdir(path[, options], callback)

fs.mkdir(path[, options])

fs.mkdir('./test', err => {
  console.log(err)
})

fs.mkdirSync('./test1')

递归创建 添加 recursive: true

fs.mkdir('./test/a/b/c', { recursive: true }, err => {
  console.log(err)
})

readdir / readdirSync 读取

fs.readdir('../03-fs模块', (err, data) => {
  console.log(err)
  console.log(data)
})

const data = fs.readdirSync('../03-fs模块')
console.log(data)

rmdir / rmdirSync 删除

// 删除文件夹
fs.rmdir('./test/a/b/c', err => {
  console.log(err)
})

fs.rmdirSync('./test/a/b')

// 递归删除文件夹 recursive马上会被弃用 不推荐使用
fs.rmdir('./test', { recursive: true }, err => {
  console.log(err)
})
// 建议使用
fs.rm('./test', { recursive: true }, err => {
  console.log(err)
})
  1. 查看资源状态

fs.stat(path[, options], callback)

fs.statSync(path[, options])

三、path模块

path提供了操作路径的功能

resolve拼接规范的绝对路径
sep获取操作系统的路径分隔符
parse解析路径并返回对象
basename获取路径的基础名称
dirname获取路径的目录名
extname获取路径的扩展名