Nodejs之fs文件操作API

本文详细介绍了Node.js内置的fs模块,包括异步和同步的文件读写、追加、复制等操作,如readFile、writeFile、appendFile等。同时,讨论了文件权限、操作标志及fs模块在文件监控等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fs是内置的核心模块,提供文件系统操作的API

fs模块结构

  • FS基本操作类
  • FS常用API

既然讲到了文件系统,就先介绍一下关于系统和文件的相关知识

  1. 权限位:在当前操作系统内,不同的用户角色对当前文件能够执行的不同操作
  2. 文件权限分为三种:
    • r:读权限,数字表示4
    • w:写权限,数字表示2
    • x:执行权限,数字表示1
  3. 操作系统将用户分为了3类
    • 文件所有者,一般都是当前用户
    • 文件所属组:当前用户的家人
    • 其他用户:如访客

在这里插入图片描述

关于文件权限问题如777代表的意义等,可以参考另一篇博客

  1. Nodejs中flag表示对文件的操作方式,常见标识符

    • r:可读
    • w:可写
    • s:同步
    • +:表示相反的操作
    • X:排他操作
    • a:表示追加操作
  2. fd就是操作系统分配给被打开文件的标识,每打开一个文件就会分配一个标识符,一般从3开始

文件操作API
readFile:异步从指定文件中读取数据
  • 作用:读取指定文件的数据
  • 语法
fs.readFile(path,options,callback)
  • 参数
    • path:文件路径,一般我们会选择相对路径
    • options:object||string,
      • encoding:string||null,文件编码,默认为null
      • flag:string,默认值为r
    • callback,回调函数,当读取完成后执行的回调函数
      • err,错误信息
      • data,文件内容,string||buffer
  • 实例
    const fs = require('fs')
    const path = require('path')
    fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{
        console.log(err)// 如果没有错误err则是null
        if(!err){
            console.log(data) //欢迎你
        }
    })
    
    fs.readFile(path.resolve('data.txt'),(err,data)=>{
        console.log(err)// 如果没有错误err则是null
        if(!err){
            console.log(data) //<Buffer e6 ac a2 e8 bf 8e e4 bd a0>
        }
    })
    console.log('11111')
    <!--会先输出111,之后才是异步的文件读取信息-->
    
  • 注意事项
    • nodejs是错误优先,所以回调中第一个参数中存储的是错误信息
    • 如果没有指定编码,则返回原始的buffer
    • 如果options为字符串,我们默认它指定的是编码
    • 当我们指定的是目录而非文件的时候,win、mac、linux会返回错误
readFileSync:同步从指定文件中读取数据
  • 作用:以同步的方式读取指定文件的数据,会等待文件的读取完成再向下执行
  • 语法
fs.readFileSync(path,options,callback)
  • 参数
    • path:文件路径,一般我们会选择相对路径
    • options:object||string,
      • encoding:string||null,文件编码,默认为null
      • flag:string,默认值为r
    • callback,回调函数,当读取完成后执行的回调函数
      • err,错误信息
      • data,文件内容,string||buffer
  • 实例
    const fs = require('fs')
    const path = require('path')
    fs.readFileSync(path.resolve('data.txt'),'utf-8',(err,data)=>{
        console.log(err)// 如果没有错误err则是null
        if(!err){
            console.log(data) //欢迎你
        }
    })
    
    fs.readFileSync(path.resolve('data.txt'),(err,data)=>{
        console.log(err)// 如果没有错误err则是null
        if(!err){
            console.log(data) //<Buffer e6 ac a2 e8 bf 8e e4 bd a0>
        }
    })
    console.log('11111')
    <!--会先输出欢迎你,再输出buffer,最后输出11111-->
    
  • 注意事项
    • nodejs是错误优先,所以回调中第一个参数中存储的是错误信息
    • 如果没有指定编码,则返回原始的buffer
    • 如果options为字符串,我们默认它指定的是编码
    • 当我们指定的是目录而非文件的时候,win、mac、linux会返回错误
writeFile:用异步的方式向指定文件中写入数据
  • 作用:用异步的方式向指定文件中写入数据,如果文件已存在内容则会产生覆盖
  • 语法
fs.writeFile(path,data[,options],callback)
  • 参数
    • path:文件路径,一般我们会选择相对路径
    • data:要写入的内容,可以是字符串也可以是buffer
    • options:object||string,
      • encoding:string||null,文件编码,默认为utf-8
      • mode:默认值为0o666
      • flag:string,默认值为w
    • callback,回调函数,当读取完成后执行的回调函数
      • err,错误信息
  • 实例
    const fs = require('fs')
    const path = require('path')
    <!--data.txt中内容为'新的内容'-->
    fs.writeFile(path.resolve('data.txt'),'新的内容',(err)=>{
        if(!err){
            fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{
                if(!err){
                    console.log(data) // 新的内容
                }
            })
        }
    })
    
    <!--data2.txt中内容为123-->
    fs.writeFile(path.resolve('data2.txt'),'这是追加的内容','utf-8',(err)=>{
        if(!err){
            fs.readFile(path.resolve('data2.txt'),'utf-8',(err,data)=>{
                if(!err){
                    console.log(data) // 123这是追加的内容
                }
            })
        }
    })
    
    
  • 注意事项
    • 如果写入的内容是buffer,则options中的encoding失效。
    • 如果写入的文件已存在,则会覆盖原有文件内容
    • 如果不存在,则创建文件并写入
    • readFile如果文件路径不存在则报错,而writeFile如果文件路径不存在则会创建文件
    • options中可以包含flag,比如我们改为a,则在原有文件中追加新内容
writeFileSync:用同步的方式向指定文件中写入数据

用法与异步写入相似

appendFile:追加的方式向指定文件中写入数据
  • 作用:以异步追加的方式向指定文件写入数据,如果文件尚不存在则创建文件
  • 语法
fs.appendFile(path,data[,options],callback)
  • 参数
    • path:文件路径,一般我们会选择相对路径
    • data:要写入的内容,可以是字符串也可以是buffer
    • options:object||string,
      • encoding:string||null,文件编码,默认为utf-8
      • mode:默认值为0o666
      • flag:string,默认值为a
    • callback,回调函数,当读取完成后执行的回调函数
      • err,错误信息
  • 实例
    const fs = require('fs')
    const path = require('path')
    <!--data.txt中内容为'append'-->
    fs.appendFile(path.resolve('data.txt'),'追加的新内容',(err)=>{
        if(!err){
            fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{
                if(!err){
                    console.log(data) // append追加的新内容
                }
            })
        }
    })
    
    
  • 注意事项
    • 如果写入的内容是buffer,则options中的encoding失效。
    • 如果options是字符串,则它指定字符编码
    • 如果文件不存在,则创建文件并写入
appendFileSync:同步追加的方式向指定文件中写入数据

用法类似于appendFile

copyFile:将某个文件中的数据拷贝至另一份文件
  • 作用:异步的将某个文件中的数据拷贝至另一份文件,默认情况下,如果dest存在则覆盖它,否则创建文件
  • 语法
fs.copyFile(src,dest[,mode],callback)
  • 参数
    • src:要拷贝的源文件
    • dest:内容存放的目标文件
    • mode:用于拷贝操作的修饰符。默认值
    • callback,回调函数
  • 实例
    const fs = require('fs')
    const path = require('path')
    <!--项目文件夹中有data.txt文件,但没有test1.txt-->
    fs.copyFile('data.txt','test1.txt',(err)=>{
        console.log(err)
    })
    
    
  • 注意事项
    • 如果dest文件不存在,则创建文件并写入
    • 如果src文件不存在,会报异常
copyFileSync:将某个文件中的数据拷贝至另一份文件
  • 作用:同步的将某个文件中的数据拷贝至另一份文件,默认情况下,如果dest存在则覆盖它,否则创建文件

其他类似于copyFile

watchFile: 对指定文件进行监控,当内容发生变化时执行回调函数
  • 作用:监视文件的变化,每当访问文件时都会调用回调函数
  • 语法
fs.watchFile(file[,options],listener)
  • 参数
    • file:要监听的文件
    • options
      • bigint:如果 bigint 选项为 true,则这些对象中的数值会被指定为 BigInts 类型。,默认值为false
      • persistent:默认true,当文件正在被监视时,进程是否应该继续运行
      • interval:默认值5007,指示轮询目标的频率,单位毫秒
    • listener
      • curr:stat对象
      • prev:stat对象
  • 实例
    const fs = require('fs')
    const path = require('path')
    <!--项目文件夹中有data.txt文件,但没有test1.txt-->
    fs.watchFile('data.txt',(cuur,prev)=>{
        if(cuur.mtime!=prev.mtime){
            console.log('修改了文件')
        }
    })
    
    //stat对象的形式如下:
    Stats {
      dev: 163689085,
      mode: 33206,
      nlink: 1,
      uid: 0,
      gid: 0,
      rdev: 0,
      blksize: 4096,
      ino: 1688849861265423,
      size: 14,
      blocks: 0,
      atimeMs: 1620382991134.3672,       
      mtimeMs: 1620382991134.3672,       
      ctimeMs: 1620382991134.3672,       
      birthtimeMs: 1620369691230.5874,   
      atime: 2021-05-07T10:23:11.134Z,   
      mtime: 2021-05-07T10:23:11.134Z,   
      ctime: 2021-05-07T10:23:11.134Z,   
      birthtime: 2021-05-07T06:41:31.231Z
    }
    
    
  • 注意事项
    • 要在修改文件(而不仅仅是访问)时收到通知,则需要比较 curr.mtime 和 prev.mtime不相等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值