Skip to content

File system

该 node:fs 模块能够以模拟标准 POSIX 函数的方式与文件系统进行交互, 所有文件系统操作都具有同步、回调和基于 promise 的形式,并且可以使用 CommonJS 语法和 ES6 模块 (ESM) 进行访问。

回调示例

  1. 回调表单将完成回调函数作为其最后一个参数,并异步调用操作
  2. 回调的参数取决于方法,但第一个参数始终保留给异常。如果操作成功完成,则第一个参数为 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
    }
   */
})

Released under the MIT License.