当前位置: 首页 > news >正文

node-fs

文章目录

      • 一. 文件写入
        • (1) 写入文件场景
        • (2)异步写入-writeFile
        • (3)同步写入-writeFileSync
        • (4)追加写入-appendFile/appendFileSync/writeFile
        • (5)流式写入-createWriteStream
      • 二.文件读取
        • (1) 文件读取应用场景
        • (2) 异步读取-readFile
        • (3) 同步读取-readFileSync
        • (4) 流式读取-createReadStream
        • (5)复制文件练习
      • 三.文件移动和重命名-rename
      • 四.文件删除
      • 五.文件夹操作
        • (1)创建文件夹-mkdir
        • (2) 读取文件夹-readdir
        • (3)删除文件夹-rmdir
      • 六.查看资源状态-stat
      • 七.`__dirname`和`__filename`
      • 八.path

一. 文件写入

(1) 写入文件场景

  • 下载文件

  • 安装软件

  • 保存程序日志

  • 编辑器保存文件

  • 视频录制

(2)异步写入-writeFile

//1.fs.writeFile(file,data[,options], callback)
/**
 * 参数说明:
 * 1. file文件名
 * 2. data待写入的数据
 * 3. options选项设置(可选)
 * 4. callback写入回调
 */
function fun1(){
  fs.writeFile('./写入的文本.txt','写入的文字',err=>{
    if(err){
      console.log(err)
      return
    }
    console.log('写入成功')
  })
}

(3)同步写入-writeFileSync

参数与fs.writeFile大体一致, 只是没有callback参数

(4)追加写入-appendFile/appendFileSync/writeFile

  1. fs.appendFile(file,data[,options],callback)
fs.appendFile('./写入的文本.txt','\n追加的文本',err=>{

  if(err) return 

  console.log('追加成功')
}
  1. 使用writeFile

    function fun3(){
      fs.writeFile('./写入的文本.txt','追加的文本',{flag:'a'},err=>{
        if(err) return
        console.log('writeFile追加成功')
      })
    }
    

(5)流式写入-createWriteStream

fs.createWriteStream(path[,options])

  • 流式写入可以减少打开关闭文件的次数

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

  let ws = fs.createWriteStream('./流式写入.txt')
  ws.write('1\n')
  ws.write('2\n')
  ws.write('3\n')
  ws.write('4\n')

  ws.end()

二.文件读取

(1) 文件读取应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • Git查看日志
  • 上传文件
  • 查看聊天记录

(2) 异步读取-readFile

//fs.readFile(path[,options],callback)
let path = './写入的文本.txt'
fs.readFile(path,(err,data) => {
    if(err) throw err
    console.log(data.toString())
})

(3) 同步读取-readFileSync

//fs.readFileSync(path[,options])
let path = './写入的文本.txt'
let data = fs.readFileSync(path)
console.log(data.toString())

(4) 流式读取-createReadStream

fs.createReadStream(path[, options])
let rs = fs.createReadStream('./写入的文本1.txt')
//每次取出64KB数据后再执行一次data回调
rs.on('data', data=>{
    console.log(data.toString());
    console.log(data.length)
})
//读取完成后, 执行end回调
rs.on('end', ()=>{
    console.log('读取完成')
})

(5)复制文件练习

const fs = require('fs')
const process = require('process')
/**
 * 复制测试.mp4到fs文件夹下
 * 1. readFile: 异步读取
 * 2. createReadStream: 流式读取
 */



// 1.readFile-writeFile
let readPath = '../测试.mp4'
let writePath = './测试(1).mp4'
let writePath2 = './测试(2).mp4'
function fun1(){
  // 读取
  fs.readFile(readPath,(err,data)=>{
    console.log('读取成功')
    // console.log(data)
    // 写入
    fs.writeFile(writePath,data,err=>{
      if(err) throw err
      console.log('写入成功')
    })
  })
}

// fun1()

//2. createReadStream-createWriteStream
function fun2(){
  let rs = fs.createReadStream(readPath)
  let ws = fs.createWriteStream(writePath2)

  //2.1
  rs.on('data', data=>{
    // console.log(data.length)
    ws.write(data)
    // ws.end() //不能加这个,加了出错
  })
  rs.on('end',()=>{
    console.log('读取完成')
  })
  //2.2
  // 管道流:rs.pipe(ws)
}
// fun2()

/**
 * process: 获取代码运行占量
 */

// fun1() //rss 20701184字节 19MB
fun2() //rss 20635648
console.log(process.memoryUsage())

三.文件移动和重命名-rename

在node中, 可以用rename和renameSync来移动或重命名文件或文件夹

fs.rename(oldPath, newPath, callBack)

  • oldPath 文件当前路径
  • newPath: 文件新的路径
  • callBack: 操作后的回调
const fs = require('fs')
// 1.fs.rename 同步修改名字和文件移动
// 2.fs.renameSync 异步修改名字和文件移动

//1.fs.name(oldPath, newPath, callback)
let oldPath = "./流式写入.txt"
let newPath = "./流式写入1.txt"
fs.rename(oldPath,newPath,err=>{
  if(err) throw err
  console.log('修改')
})

四.文件删除

在node中可以使用unlink或unlinkSync来删除文件

fs.unlink(path, callback)

const fs = require('fs')
/**
 * 1.unlink unlinkSync
 * 2.rm rmSync
 */

//1.fs.unlink(path,callback)
// fs.unlink('./测试1',err=>{
//   if(err) throw err
// })

//2.fs.rm(path,callback)
fs.rm('./测试2',err=>{
  if(err) throw err
})  

五.文件夹操作

(1)创建文件夹-mkdir

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

  1. 异步创建文件夹
fs.mkdir('./page', err => {
    if (err) {
      throw err
    } else {
      console.log('创建成功')
    }
  })
  1. 异步创建递归文件夹
  fs.mkdir('./a/b/c',{recursive: true}, err => {
    if (err) {
      throw err
    }
      console.log('创建成功')
  })

(2) 读取文件夹-readdir

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

fs.readdir('./', (err,data) => {
    if (err) {
      throw err
    } else {
      console.log(data)
    }
  })

(3)删除文件夹-rmdir

  1. fs.rmdir(path[,options],callback

    /**
     * 只能删除空文件夹
     */
    fs.rmdir('./a', err => {
        if (err) {
            throw err
        } else {
            console.log('删除成功')
        }
    })
    
  2. 深度删除

    fs.rmdir('./a',{recursive: true}, err => {
        if (err) {
          throw err
        } else {
          console.log('删除成功')
        }
      })
    

六.查看资源状态-stat

  • 异步: fs.stat(path[, options], callback)
  • 同步: fs.statSync(path[,options])
const fs  = require('fs')
fs.stat('./测试(2).mp4',(err,data)=>{
  if(err) throw err
  console.log(data)
  console.log(data.isFile())//检测是否为文件
  console.log(data.isDirectory()) //检测是否为文件夹
})
/**
  Stats {
  dev: 286136082,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 1688849860562346,
  size: 15423418, //文件体积
  blocks: 30128,
  atimeMs: 1678959494454.5403,
  mtimeMs: 1678959494454.5403,
  ctimeMs: 1678959494454.5403,
  birthtimeMs: 1678959448707.1306, //创建时间
  atime: 2023-03-16T09:38:14.455Z,
  mtime: 2023-03-16T09:38:14.455Z, //最后修改时间
  ctime: 2023-03-16T09:38:14.455Z,
  birthtime: 2023-03-16T09:37:28.707Z
}
 */

七.__dirname__filename

  1. __dirname保存着当前文件所在目录的绝对路径, 可以使用__dirname与文件名拼接成绝对路径
  2. __filename表示当前正在执行的脚本的文件名. 它将输出文件所在位置的绝对路径
console.log(__dirname) //C:\Users\wang9\Desktop
console.log(__filename) //C:\Users\wang9\Desktop\file.js

八.path

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

相关文章:

  • 无人机动力测试台-自动化测试系统拉力、扭矩、电压、电流、转速和效率
  • 国产机器人抢滩进行时!优艾智合引领智能制造浪潮
  • Autosar标准与其他标准的关系
  • 语音通知短信 API:一种新型的信息传递方式
  • 网络现代化势在必行,VMware 发布软件定义网络 SD-WAN 全新方案
  • Redis缓存穿透、击穿、雪崩问题及解决方法
  • 音乐制作:Ableton Live 11 Suite Mac
  • C++ 学习笔记(十)(继承、抽象篇)
  • xss labs(11-14)
  • STM32学习(四)
  • JAVA开发(自研项目的开发与推广)
  • 计算机网络的基本组成
  • Linux- 系统随你玩之--网络上的黑客帝国
  • 图片的美白与美化
  • 第十四届蓝桥杯三月真题刷题训练——第 19 天
  • SQL语句性能分析
  • WEB网站服务(一)
  • 【ChatGPT】教你搭建多任务模型
  • 2023/3/21总结
  • Python 基础教程【3】:字符串、列表、元组
  • https://app.hackthebox.com/machines/Inject
  • Spring —— Spring简单的读取和存储对象 Ⅱ
  • 渗透测试之冰蝎实战
  • Mybatis、TKMybatis对比
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读