node.js小白学习笔记(二)- fs模块(下)

298 阅读4分钟

文本接上篇文章继续学习fs模块,每种方法都有对应的示例,理解起来非常容易。

1.fs模块文件的重命名和移动

同步语法:fs.rename(oldPath, newPath, callback)

异步语法:fs.renameSync(oldPath, newPath)

const fs = require('fs');

//调用 rename 方法 重命名文件
fs.rename('./写入文件.txt','./写入文件_重命名.txt',(err)=>{
  if(err){
    console.log('重命名失败');
    return
  }else{
    console.log('重命名成功');
  }
})

// 调用 rename 方法 移动文件
fs.rename('./写入文件_重命名.txt','./resource/写入文件_重命名_移动.txt',  (err)=>{
  if(err){
    console.log('移动失败');
  }else{
    console.log('移动成功');
  }
})

2.fs模块的文件删除

同步语法:fs.unlink(path, callback),fs.rm(path, callback)

异步语法:fs.unlinkSync(path),fs.rmSync(path)

const fs = require('fs');

//删除
fs.unlink('./resource/写入文件_重命名_移动.txt',(err)=>{
  if(err){
    console.log('删除失败');
  }else{
    console.log('删除成功');
  }
})

//另外一个方法 rm() node14.4版本增加的方法 
fs.rm('resource/写入文件_重命名_移动.txt',(err)=>{
  if(err){
    console.log('删除失败');
  }else{
    console.log('删除成功');
  }
})

3.fs模块的文件夹操作:创建、读取、删除

  • 创建:
    • 异步:fs.mkdir(path[,options],callback)
    • 同步:fs.mkdirSync(path[,options])
// 导入fs
const fs = require('fs');

//创建文件夹 
 fs.mkdir('./makeDir',(err)=>{
   if(err){
     console.log('创建失败');
   }else{
     console.log('创建成功');
   }
 })

// 递归创建文件夹,设置{recursive:true}
fs.mkdir('./makeDir/makeDir2',{recursive:true},(err)=>{
   if(err){
     console.log('创建失败');
   }else{
     console.log('创建成功');
   }
 })
  • 读取:
    • 异步:fs.readdir(path[,options],callback)
    • 同步:fs.readdirSync(path[,options])
 fs.readdir('./resource',(err,data)=>{
   if(err){
     console.log('读取失败');
   }else{
     console.log(data); 返回的是一个数组,元素为文件名
   }
 })
  • 删除:
    • 异步:fs.rmdir(path[,options],callback)
    • 同步:fs.rmdirSync(path[,options])
// 删除文件夹
fs.rmdir('./makeDir',(err)=>{
  if(err){
    console.log('删除失败');
  }else{
    console.log('删除成功');
  }
})

//递归删除文件夹,设置{recursive:true}
fs.rmdir('./makeDir',{recursive:true},(err)=>{
  if(err){
    console.log('删除失败');
  }else{
    console.log('删除成功');
  }
})

但是,建议使用rm()方法删除文件夹。使用rmdir()方法会有警告,将来有可能被移除。

//建议使用,没有警告
fs.rm('./makeDir',{recursive:true},(err)=>{
  if(err){
    console.log('删除失败');
  }else{
    console.log('删除成功');
  }
})

4.fs模块查看资源状态

语法:fs.stat(path,callback)

  //导入 fs模块
const fs = require('fs');

//调用stat()
fs.stat('./resource/用于文件流式读取.mp4',(err,stats)=>{
  if(err){
    console.log('操作失败');
    return
  }
  console.log(stats) //输出如下
  /*
    Stats {
      dev: 2013446249,
      mode: 33060,
      nlink: 1,
      uid: 0,
      gid: 0,
      rdev: 0,
      blksize: 4096,
      ino: 12947848928797276,
      size: 6244006, // 文件大小
      blocks: 12200,
      atimeMs: 1726297867538.1348,
      mtimeMs: 1726137462179.1404,
      ctimeMs: 1726137462193.6506,
      birthtimeMs: 1726223788797.8257,
      atime: 2024-09-14T07:11:07.538Z,
      mtime: 2024-09-12T10:37:42.179Z,
      ctime: 2024-09-12T10:37:42.194Z,
      birthtime: 2024-09-13T10:36:28.798Z
    }
  */
  //检测stats是不是文件
  console.log(stats.isFile()) //true
  //检测stats是不是文件夹
  console.log(stats.isDirectory()) //false
})

5.fs模块 路径:相对路径和绝对路径

路径的应用适用于fs模块中涉及路径的操作,下面以同步写入为例,也可以用于读取、复制、移动、删除等等。

//引入 fs模块
const fs = require('fs')

//相对路径 以同步写入为例
fs.writeFileSync('./index.html','love') //当前目录写
fs.writeFileSync('index.html','love') //当前目录写
fs.writeFileSync('../index.html','love') //相对当前目录的上级目录里

//绝对路径 以同步写入为例
fs.writeFileSync('D:/index.html','love') //加盘符
fs.writeFileSync('/index.html','love') //效果同上,也是创建在了根目录
fs.writeFileSync('C:/index.html','love') //C盘不可写入,没有权限

特别注意: fs模块文件的相对路径参考的不是当前js文件所在的位置,而是参考的命令行的工作目录。因此,有时通过相对路径来操作文件可能达不到预期目的,解决方法是,使用绝对路径:__dirname,可以被认为是一个'全局变量',保存的是这个变量所在文件的所在目录的绝对路径。

//使用__dirname
fs.writeFileSync(__dirname+'/index.html','love')

6.fs模块 批量重命名

//导入 fs模块
const fs = require('fs');

//读取文件夹
const files = fs.readdirSync('./');

files.forEach((item,index)=>{
  fs.renameSync(`./${item}`,`./${''+index+item}`)
})

【写在后面】:截止到这里,fs模块的学习就先到这里了。其实没什么东西,只需要理解这个模块是干什么的,能用在什么场景下,或者将来遇到问题的话,能不能作为解决问题的方案,方法还挺多的,但是不必背,知道都有什么作用的方法,用的时候查就好了,用的多了自然就记得了。

之前在项目中遇到拍照上传的功能,上传很慢,有一种解决方案就是分段上传,如果当时学了这个,那就会想是不是可以通过流式读取和写入的方式将数据分段读取后再加上分段标记然后再上传。

学无止境,强大自己的内核,武装自己的工具,在技术这条路上,很重要也很有趣。