fs(Node.js笔记)

208 阅读4分钟

介绍:fs全称为file system,称之为文件系统,是Node.js中的内置模块,可以对计算机中的磁盘进行操作

文件写入

文件写入就是将数据保存到文件中

1.1 writeFile异步写入

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

参数说明

file 文件名

data 待写入的数据

options 选项设置(可选)

callback 写入回调

返回值:undefined

代码

// 1.导入fs模块
const fs = require('fs')
// 2.写入文件
fs.writeFile('./座右铭.txt', '巧者劳而智者忧', err => {
  //err 写入失败:错误对象 写入成功:null
  if (err) {
    console.log('写入失败')
    return
  }
  console.log('写入成功')
})

1.2 writeFileSync同步写入

语法fs.writeFileSync(file,data[,options])

返回值:undefined

// 1.导入fs模块
const fs = require('fs')
// 2.写入文件
fs.writeFile('./座右铭.txt', '巧者劳而智者忧', err => {
  //err 写入失败:错误对象 写入成功:null
  if (err) {
    console.log('写入失败')
    return
  }
  console.log('写入成功')
})

//同步写入
fs.writeFileSync('./data.txt', 'test')

1.3 appendFile/appendFileSync追加写入

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

语法
fs.appendFile(file, data[, options], callback)

fs.appendFileSync(file, data[, options])

返回值:都为undefined

代码

fs.appendFile('./座右铭.txt',',无能者无所求。',err=>{
  //判断
  if(err){
    console.log('写入失败')
    return
  }
  console.log('追加写入成功')
})
fs.writeFile('./座右铭.txt', '\r\n饱食而遨游,泛若不系之舟,虚而遨游者也。', { flag: 'a' }, err => {
  if (err) {
    console.log('写入失败')
    return
  }
  console.log('写入成功')
})

1.4 createWriteStream流式写入

语法fs.createWriteStream(path[,options])

返回值:Object

代码

// 1.导入fs 
const fs = require('fs')
// 2.创建写入流对象
const ws = fs.createWriteStream('./昨夜朱楼梦.txt')
// 3.write 
ws.write('昨夜朱楼梦,今宵水国吟。\r\n')
ws.write('岛云蒸大海,岚气接丛林。\r\n')
ws.write('月本无今古,情缘自浅深。\r\n')
ws.write('汉南春历历,焉得不关心。\r\n')
// 4.关闭通道
ws.close()

总结

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

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

1.5 写入文件的场景

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

文件读取

2.1 异步读取

语法: fs.readFile(path[,options],callback)
参数说明
path 文件路径
options 选项配置
callback 回调函数
返回值: undefined
代码

// 导入fs模块
const fs = require('fs')
fs.readFile('./文章.txt', (err, data) => {
  if (err) throw err
  console.log(data)
})
fs.readFile('./文章.txt','utf-8', (err, data) => {
  if (err) throw err
  console.log(data)
})

2.2 readFileSync同步读取

语法:fs.readFileSync(path[,options])
返回值: string | Buffer
代码

let data=fs.readFileSync('./文章.txt')
let data2=fs.readFileSync('./文章.txt','utf-8')

2.3 createReadStream 流式读取

语法:fs.createReadStream(path[,options])
返回值: Object
代码

// 创建读取流对象
let rs=fs.createReadStream('./文章.txt')
// 每次取出64k,数据后执行一次,data 回调
rs.on('data',data=>{
  console.log(data)
  console.log(data.length)
})
//读取完毕后,执行end回调
rs.on('end',()=>{
  console.log('读取完成')
})

文件移动和重命名

语法
fs.rename(oldPath,newPath,callback) fs.renameSync(oldPath,newPath)
参数说明:
oldPath 文件当前的路径
newPath 文件新的路径
代码

fs.rename('./笔记.txt','./node/笔记.txt',(err)=>{
  if(err) throw err
  console.log('书写完成')
})
fstat.renameSync('./笔记.txt','./node/笔记.txt')

文件删除

语法
fs.unlink(path.callback)
fs.unlinkSync(path)
代码

const fs = require('fs')
fs.unlink('./test.txt', err => {
  if (err) throw err
  console.log('删除成功')
})
fs.unlinkSync('./test1.txt')

文件夹操作

方法说明
mkdir/mkdirSync创建文件夹
readdir/readdirSync读取文件夹
rmdir/rmdirSync删除文件夹

3.1 mkdir 创建文件夹
语法
fs.mkdir(path[,options],callback)
fs.mkdirSync(path[,options])
代码

//异步创建文件夹
fs.mkdir('./test',err=>{
  if(err) throw err
  console.log('创建成功')
})
// 递归异步创建
fs.mkdir('./1/2/3',{recursive:true},err=>{
  if(err) throw err
  console.log('递归创建成功')
})
// 递归同步创建文件夹
fs.mkdirSync('./1/2/3',{recursive:true})

3.1 mkdir 创建文件夹
语法
fs.readdir(path[,options],callback)
fs.readdirSync(path[,options])
代码

// 异步读取
fs.readdir('./test',(err,data)=>{
  if(err) throw err
  console.log(data)
})
// 同步读取
let data=fs.readdirSync('./test')
console.log(data)

3.1 rmdir 删除文件夹
语法
fs.rmdir(path[,options],callback)
fs.rmdirSync(path[,options])
代码

// 异步删除文件夹
fs.rmdir('./test',err=>{
  if(err) throw err
  console.log('删除成功')
})
// 异步递归删除文件夹
fs.rmdir('./1',{recursive:true},err=>{
  if(err){
    console.log(err)
  }
  console.log('递归删除')
})
// 同步递归删除文件夹
fs.rmdirSync('./1',{recursive:true})

查看资源状态

语法
fs.stat(path[,options],callback)
fs.statSync(path[,options])
代码

// 异步获取状态
fs.stat('./test',(err,data)=>{
  if(err) throw err
  console.log(data)
})
// 同步获取状态
let data=fs.statSync('./test')

相对路径和绝对路径

  • 相对路径

  • 绝对路径
    D:/Program Files windows系统下的绝对路径
    /usr/bin Linux系统下的绝对路径

__dirname

__dirname与require类似,都是Node.js环境中的‘全局’变量
__dirname保存着当前文件所在目录的绝对路径,可以使用__dirname与文件名拼接成绝对路径

代码

let data=fs.readFileSync(__dirname+'/data.txt')
    console.log(data)

注意: 使用fs模块时,尽量使用__dirname将路径转化为绝对路径,这样可以避免相对路径产生的bug