Node.js入门:fs 模块学习

前言

fs 模块是 Node.js 的内置模块,提供操作文件系统的能力,比如文件及目录的创建、写入及删除等操作。

它是一个十分基础和有用的模块。Node.js 常用作 web 服务或者工具的开发,最依赖的就是 http 和 fs 模块。

fs 模块中,所有的方法都分为同步和异步两种实现。在很久以前,node 还不支持 Promise 的时代,异步只能通过回调的方式去使用。

文件读写操作

准备一个文件:

// 1.txt

昆吾kw

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

读取文件。

const fs = require('fs')
// fs 模块的 Promise 实现
const fsp = require('fs/promises')

// 同步的形式读取
let res = fs.readFileSync('./1.txt')
// 如果不指定 encoding 编码格式,默认以 buffer 格式读取
console.log(res) // <Buffer e6 98 86 e5 90 be 6b 77>


// 回调的形式读取 
// encoding:utf8 utf-8皆可
fs.readFile('./1.txt', {
    
     encoding: 'utf8' }, (err, res) => {
    
    
  if (err) {
    
    
    return console.log(err)
  }
  console.log(res)
})

// Promise 形式读取
fsp.readFile('1.txt', {
    
     encoding: 'utf8' }).then(res => {
    
    
  console.log(res)
}).catch(err => {
    
    
    console.log(err)
})
// 输出:昆吾kw

fs.writeFile(file, data[, options], callback)

写入文件。

// 若文件不存在会自动创建文件
fsp.writeFile('2.txt', 'hello').then(() => {
    
    
  // 写入成功没有结果
}).catch(err => {
    
    
    console.log(err)
})

fs.copyFile( src, dest, mode, callback )

拷贝文件。

fs.copyFile('1.txt', '3.txt', (err) => {
  if (err) {
    return console.log(err);
  }
}); 

文件夹的操作

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

创建目录。

fs.mkdir('src', err => {
    
    
  console.log(err);
});

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

读取目录下的所有文件和目录。

fs.readdir('./', (err, res) => {
    
    
  if (err) {
    
    
    return console.log(err);
  }
  console.log(res)
})
// [ '1.txt', '2.txt', '3.txt', 'index.js', 'src' ]

fs.stat(path, callback)

查看文件或者目录信息。

fs.statSync('2.txt').isFile(); // true

fsp.stat('1.txt').then(res => {
    
    
  // 该 API 返回一个 Stats 对象,可以读取文件或目录的一些状态属性
  console.log(res)
  console.log(res.isFile()) // true
})

fsp.stat('src').then(res => {
    
    
  console.log(res.isDirectory()) // true
})

fs.rename(oldPath, newPath, callback)

文件和目录的重命名。也可以用作文件或者目录的移动。

fs.rename('4.txt', '5.txt', (err) => {
    
    
   console.log(err)
})

fs.rename('abc', 'abc2', (err) => {
    
    
  console.log(err)
})

fs.unlink()

只能用来删除文件。

fs.unlink('5.txt', (err) => {
    
    
  console.log(err)
})

fs.rm()

可递归删除文件和目录。

fs.rm('5.txt', (err) => {
    
    
  console.log(err)
})

fs.rmdir()

删除目录。

fs.rmdir('abc2', (err) => {
    
    
  console.log(err)
})

文件描述符 flags

在读写文件时,通过可选的 flags 参数来指定一些行为。比如:

fs.writeFile('./1.txt', 'kw', {
    
    flag:'a'},function(){
    
    
  console.log('ok');
});

flag 默认为 w ,如果原来的文件有内容,则会覆盖掉。设置为 a,表示会在原始内容上追加内容。

符号 含义
r 读文件,文件不存在报错
r+ 读取并写入,文件不存在报错
rs 同步读取文件并忽略缓存
w 写入文件,不存在则创建,存在则清空
wx 排它写入文件
w+ 读取并写入文件,不存在则创建,存在则清空
wx+ 和w+类似,排他方式打开
a 追加写入
ax 与a类似,排他方式写入
a+ 读取并追加写入,不存在则创建
ax+ 作用与a+类似,但是以排他方式打开文件

各个描述符的基本含义:

  • r 读取
  • w 写入
  • s 同步
  • + 增加相反操作
  • x 排他方式
  • r+ w+的区别?
    • 当文件不存在时,r+不会创建,而会导致调用失败,但w+会创建。
    • 如果文件存在,r+不会自动清空文件,但w+会自动把已有文件的内容清空。

小结

本文总结了 fs 模块的一些常用方法。fs 模块大概有100多个方法,非常多,常用的大概就是文中总结的这些。还有一些和 Stream 有关的方法,会在后面讲到。

猜你喜欢

转载自blog.csdn.net/Old_Soldier/article/details/128859857