Skip to content

fs

介绍

Node.js 的文件系统模块(fs 模块)提供了丰富的 API,用于读取、写入、删除文件以及执行其他文件系统操作。

fs 模块既支持同步方法也支持异步方法,使得开发者可以根据具体需求选择合适的方式来处理文件操作。

导入

js
const fs = require('fs')

读取文件

异步读取文件 (fs.readFile)

js
fs.readFile('path/to/file.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Error reading file:', err)
    return
  }
  console.log(data)
})
  • path: 文件路径
  • encoding: 文件编码('utf8''base64',等),若不指定,默认返回 Buffer
  • callback(err, data): 异常对象和读取的文件内容

同步读取文件 (fs.readFileSync)

js
const data = fs.readFileSync('path/to/file.txt', 'utf8')
console.log(data)

写入文件

异步写入文件 (fs.writeFile)

js
fs.writeFile('path/to/file.txt', 'Hello, world!', err => {
  if (err) {
    console.error('Error writing file:', err)
    return
  }
  console.log('File written successfully')
})

同步写入文件 (fs.writeFileSync)

js
fs.writeFileSync('path/to/file.txt', 'Hello, world!')
console.log('File written successfully')

追加内容到文件 (fs.appendFile)

js
fs.appendFile('path/to/file.txt', 'Appended content', err => {
  if (err) {
    console.error('Error appending to file:', err)
    return
  }
  console.log('Content appended successfully')
})

删除文件

js
fs.unlink('path/to/file.txt', err => {
  if (err) {
    console.error('Error deleting file:', err)
    return
  }
  console.log('File deleted successfully')
})

同步删除文件 (fs.unlinkSync)

js
fs.unlinkSync('path/to/file.txt')
console.log('File deleted successfully')

检查文件或目录是否存在 (fs.exists)

异步检查文件是否存在 (fs.exists)

js
fs.exists('path/to/file.txt', exists => {
  console.log(exists ? 'File exists' : 'File does not exist')
})

获取文件信息

获取文件信息 (fs.stat)

js
fs.stat('path/to/file.txt', (err, stats) => {
  if (err) {
    console.error('Error getting file stats:', err)
    return
  }
  console.log(stats)
})
  • stats 对象包含文件的详细信息(如大小、创建时间、修改时间等)。

获取文件信息同步 (fs.statSync)

js
const stats = fs.statSync('path/to/file.txt')
console.log(stats)

重命名文件或目录

异步重命名 (fs.rename)

js
fs.rename('path/to/oldFile.txt', 'path/to/newFile.txt', err => {
  if (err) {
    console.error('Error renaming file:', err)
    return
  }
  console.log('File renamed successfully')
})

同步重命名 (fs.renameSync)

js
fs.renameSync('path/to/oldFile.txt', 'path/to/newFile.txt')
console.log('File renamed successfully')

创建目录

异步创建目录 (fs.mkdir)

js
fs.mkdir('path/to/newDir', { recursive: true }, err => {
  if (err) {
    console.error('Error creating directory:', err)
    return
  }
  console.log('Directory created successfully')
})

同步创建目录 (fs.mkdirSync)

js
fs.mkdirSync('path/to/newDir', { recursive: true })
console.log('Directory created successfully')

读取目录内容

异步读取目录内容 (fs.readdir)

js
fs.readdir('path/to/dir', (err, files) => {
  if (err) {
    console.error('Error reading directory:', err)
    return
  }
  console.log(files) // 返回文件和子目录名的数组
})

同步读取目录内容 (fs.readdirSync)

js
const files = fs.readdirSync('path/to/dir')
console.log(files)

删除目录

异步删除目录 (fs.rmdir)

js
fs.rmdir('path/to/dir', err => {
  if (err) {
    console.error('Error removing directory:', err)
    return
  }
  console.log('Directory removed successfully')
})

同步删除目录 (fs.rmdirSync)

js
fs.rmdirSync('path/to/dir')
console.log('Directory removed successfully')

文件权限

修改文件权限 (fs.chmod)

js
fs.chmod('path/to/file.txt', 0o777, err => {
  if (err) {
    console.error('Error changing file permissions:', err)
    return
  }
  console.log('File permissions changed')
})

获取文件权限 (fs.stat)

js
fs.stat('path/to/file.txt', (err, stats) => {
  if (err) {
    console.error('Error getting file stats:', err)
    return
  }
  console.log('File permissions:', stats.mode)
})

流操作

Node.js 还提供了流(Streams)API,用于读取或写入大文件时更高效的处理。

创建文件读取流 (fs.createReadStream)

js
const readStream = fs.createReadStream('path/to/file.txt', 'utf8')
readStream.on('data', chunk => {
  console.log('Reading chunk:', chunk)
})
readStream.on('end', () => {
  console.log('File read complete')
})

创建文件写入流 (fs.createWriteStream)

js
const writeStream = fs.createWriteStream('path/to/output.txt')
writeStream.write('Hello, world!')
writeStream.end()
writeStream.on('finish', () => {
  console.log('File write complete')
})

文件锁定

Node.js 的 fs 模块本身没有内建的文件锁定机制,但可以通过额外的库(如 lockfile)来实现文件锁定。

异常处理

fs 的异步方法通常通过回调来返回错误。错误对象 err 是第一个参数,成功时 errnull。对于同步方法,错误会抛出异常,应该使用 try...catch 捕获。

基于 MIT 许可发布