Node 内置模块 【fs模块】

文章目录

  • 🌟前言
  • 🌟fs模块
    • 🌟 使用fs模块
    • 🌟 异步编程和同步编程
      • 🌟 异步编程
      • 🌟 同步编程
    • 🌟常用操作
      • 🌟 文件操作
        • 🌟 readFile异步读取文件
        • 🌟 readFileSync同步读取文件
        • 🌟writeFile异步写入文件
        • 🌟 writeFileSync同步写入文件
        • 🌟appendFile异步追加写入文件末尾
        • 🌟 rename重命名文件
        • 🌟unlink删除文件
        • 🌟练习:文件拷贝copy
        • 🌟文件夹操作
          • 🌟mkdir创建目录
          • 🌟练习:创建深层次的目录及文件
          • 🌟 删除目录
          • 🌟判断文件或文件夹是否存在
          • 🌟 读取目录下所有文件
          • 🌟查看文件或文件夹状态
          • 🌟 练习:删除非空文件夹
  • 🌟写在最后

在这里插入图片描述

🌟前言

哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天带领大家初识一下 Node内置模块 fs 模块;让我们一起来看看吧🤘

🌟fs模块

fs模块用于对系统文件及目录进行操作,它提供了文件的读取、写入、更名、删除、遍历目录等文件系统操作。与其他模块不同的是,fs 模块中所有的操作都提供了异步和同步的两个版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()

🌟 使用fs模块

要使用fs模块需要通过如下命令该模块。

var fs = require('fs')

模块中所有方法都有同步和异步两种形式。

异步形式始终以完成回调作为它最后一个参数。传给完成回调的参数取决于具体方法,但第一个参数总是留给异常。如果操作成功完成,则第一个参数会是 null

当使用同步形式时,任何异常都会被立即抛出。 可以使用 try/catch 来处理异常,或让它们往上冒泡。

🌟 异步编程和同步编程

🌟 异步编程

Node.js异步编程的直接体现就是通过回调函数来实现。 [注意] 异步编程依赖于回调来实现,但不代表使用了回调函数程序就异步化了.

非阻塞代码的实现,即异步编程

创建example.txt文件,如下:

异步和同步

创建main.js文件,如下:

var fs=require("fs");  
fs.readFile("example.txt","utf-8",function(error,data){   
   if(err) throw err;  
   console.log(data.toString());  
});
console.log("end");

执行结果如下:

$ node main.js
end
异步和同步

🌟 同步编程

var fs=require("fs");  
var con=fs.readFileSync("input.txt");   
console.log(con.toString());   
condole.log("end");

执行结果如下:

$ node main.js
异步和同步
end

以上例子第一个实例不需要等待文件读取完成,就可以在读取文件的同时执行接下来的代码,大大提高了程序的性能。
第二个例子在文件读取完成之后才执行完程序。

故:阻塞代码是按照顺序依次执行的,而非阻塞的代码不需要按顺序,所以如果需要处理回调函数的参数,就需要写在回调函数内。

🌟常用操作

文件的操作:读取、写入、追加、删除、拷贝

方法描述
fs.readFile(filename,[option],callback)异步读取文件
fs.readFileSync(file[, options])同步读取文件
fs.writeFile(filename,data,[options],callback)异步写入文件
fs.writeFileSync(file, data[, options])同步写入文件
fs.appendFile(file,data,[,options],callback())异步追加写入文件末尾
fs.appendFileSync(file, data[, options])同步追加写入文件末尾
fs.unlink(path,callback)异步删除文件
fs.unlinkSync(path)同步删除文件
fs.copyFile(src, dest[, flags], callback)异步拷贝文件
fs.copyFileSync(src, dest[, flags])同步拷贝文件

文件夹的操作:创建、删除、读取

方法描述
fs.mkdir(path,[mode],callback)异步创建目录(创建目录时,父目录必须存在)
fs.mkdirSync(path[, mode])同步创建目录
fs.rmdir(path,callback)异步删除目录
fs.rmdirSync(path)同步删除目录
fs.readdir(path,callback)异步读取目录下所有文件
fs.readdirSync(path[, options])同步读取目录下所有文件

其它常用文件操作

方法描述
fs.existsSync(path)判断文件/文件夹是否存在,如果文件存在,则返回 true,否则返回 false。
fs.rename(oldPath,newPath,callback)异步重命名文件/文件夹
fs.renameSync(oldPath, newPath)同步重命名文件/文件夹
fs.stat(path, callback)异步查看文件或文件夹状态 callback(err,stats)
fs.statSync(path)同步的查看文件或文件夹状态,返回一个 fs.Stats 实例
stats.isFile()判断是否为文件
stats.isDirectory()判断是否为目录

🌟 文件操作

flags参数可以是一下值:

Flag描述
r以读取模式打开文件,如果文件不存在抛出异常
r+以读写模式打开文件,如果文件不存在抛出异常
rs以同步的方式读取文件
rs+以同步的方式读取和写入文件
w以写入模式打开文件,如果文件不存在则创建
wx类似’w’,但是如果文件路径存在,则文件写入失败
w+以读写模式打开文件,如果文件不存在则创建
wx+类似’w+',但是如果文件路径存在,则文件读写失败
a以追加模式打开文件,如果文件不存在则创建
ax类似’a’,但是如果文件路径存在,则文件追加失败
a+以读取追加模式打开文件,如果文件不存在则创建
ax+类似’a+',但是如果文件路径存在,则文件读取追加失败

🌟 readFile异步读取文件

fs.readFile(filename,[encoding],[callback(err,data)])是最简单的读取 文件的函数。它接受一个必选参数 filename,表示要读取的文件名。第二个参数 encoding 是可选的,表示文件的字符编码。callback 是回调函数,用于接收文件的内容。

fs.readFile(filename,[option],callback)

参数说明:

  • filename String 文件名
  • option Object
    • encoding String |null default=null 如果字符编码未指定,则返回原始的 buffer。
    • flag String default=‘r’
  • callback Function 回调有两个参数 (err, data),其中 data 是文件的内容。
var fs = require('fs');
fs.readFile('./test.txt',function(err,data){
    if(err){
        console.error(err);
        return ;
    }
    console.log(data);
})
console.log('OK')

结果:

OK
<Buffer 68 65 6c 6c 6f 21>

如果字符编码未指定,则返回原始的 buffer。

异步方法不会阻塞主进程,不会影响后续代码执行

🌟 readFileSync同步读取文件

fs.readFileSync(file[, options])

参数说明:

  • filename String 文件名
  • option Object
    • encoding String |null default=null 如果字符编码未指定,则返回原始的 buffer。
    • flag String default=‘r’
var fs = require('fs');
try{
    var data = fs.readFileSync('./test.txt');
    console.log(data);
}catch (err){
    console.error(err);
}
console.log('OK')

结果

<Buffer 68 65 6c 6c 6f 21>
OK

同步方法会阻塞主进程的执行,在数据没有返回之前不能执行后续代码 同步方法不需要传递回调函数,通过函数返回值接受结果

🌟writeFile异步写入文件

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

异步地写入数据到文件,如果文件已经存在,则替代文件。 data 可以是一个字符串或一个 buffer。

如果 data 是一个 buffer,则忽略 encoding 选项。它默认为 ‘utf8’。

参数说明:

  • filename String 文件名
  • data String buffer
  • option Object
    • encoding String |null default=‘utf-8’
    • mode Number default=438(aka 0666 in Octal) 表示当前文件的操作权限
    • flag Stringdefault=‘w’
  • callback Function
var fs = require('fs');
var buf = Buffer.from('hello');
// 写入文件内容(如果文件不存在会创建一个文件)
// 写入时会先清空文件
fs.writeFile('./test.txt',buf,function (err) {
    if(err)throw err;
})
fs.writeFile('./test.txt','ok?',{flag:'a'},function (err) {
    if(err)throw err;
})

🌟 writeFileSync同步写入文件

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

参数说明:

  • file String Buffer
  • data String Buffer
  • options Object String
    • encoding String Null 默认 = ‘utf8’
    • mode Integer 默认 = 0o666
    • flag String 默认 = ‘w’

fs.writeFile() 的同步版本。返回 undefined。

🌟appendFile异步追加写入文件末尾

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

参数说明:

  • file String Buffer
  • data String Buffer
  • options Object String
    • encoding String Null 默认 = ‘utf8’
    • mode Integer 默认 = 0o666
    • flag String 默认 = ‘a’
  • callback Function

异步地追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 buffer。

fs.appendFile('message.txt', 'data to append', (err) => {
  if (err) throw err;
  console.log('The "data to append" was appended to file!');
});

同步调用方法:fs.appendFileSync(file, data[, options]) 返回 undefined。

🌟 rename重命名文件

fs.rename(oldPath,newPath,callback)

修改文件名字

  • olaPath:原来的名字
  • newPath:新的名字
  • callback:修改完成后执行的回调函数

实例:

var fs = require('fs');
var root = __dirname;
fs.rename(root + 'oldername.txt', root + 'newname.txt', function() {
    if (err) throw err;
    console.log('rename complete');
});

被指定的文件被重命名为newname.txt

同步调用方法:fs.renameSync(oldPath, newPath) 返回 undefined。

🌟unlink删除文件

fs.unlink(path,callback)

删除文件

  • path:要删除的文件的名字
  • callback:删除完成后执行的回调函数
var fs = require('fs');
var root = __dirname;
fs.stat(root + 'duang.txt', function( err ) {
    if (err) throw err;
});

同步调用方法:fs.unlinkSync(path) 返回 undefined。

🌟练习:文件拷贝copy

function copy(src,target){
    //实现
}

🌟文件夹操作

🌟mkdir创建目录
fs.mkdir(path,[mode],callback)
  • path:创建的目录
  • mode:目录的模式
  • callback:回调函数

创建目录时,父目录必须存在

同步调用方法:fs.mkdirSync(path[, mode])

🌟练习:创建深层次的目录及文件

实现思路

  1. 将目录转换为数组
  2. 依次判断目录,如果存在跳过否则创建
  3. 最后创建一个最终目录

需要自定义,如下:

function makedir(path,callback) {
    var all = path.split('/');
    var p ="";
    all.forEach(function (v,i) {
        p+=v+'/';
        var f = fs.existsSync(p);
        if(!f){
            fs.mkdir(p,function(err){
                if(err){
                    console.log('创建失败')
                }else{
                    console.log('创建成功')
                }
            })
        }else{
            console.log('目录存在')
        }
    })
}
🌟 删除目录
fs.rmdir(path,callback)
  • path:要删除的目录
  • callback:删除后执行的回调函数

同步调用方法:fs.rmdirSync(path)

🌟判断文件或文件夹是否存在
fs.existsSync(path)

如果文件存在,则返回 true,否则返回 false。

🌟 读取目录下所有文件
fs.readdir(path,callback)
🌟查看文件或文件夹状态
fs.stat(path, callback)
  • path
  • callback err,stat
fs.stat('./test',function(err,stats){
    stats.isFile() //判断是否为文件
    stats.isDirectory() //判断是否为目录
})js
fs.statSync(path)
  • path 返回一个 fs.Stats 实例。
{
  dev: 115759,
  mode: 16822,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: undefined,
  ino: 7881299347905749,
  size: 0,
  blocks: undefined,
  atimeMs: 1498637534631.3472,
  mtimeMs: 1498637534631.3472,
  ctimeMs: 1498637534631.3472,
  birthtimeMs: 1498637534631.3472,
  atime: 2017-06-28T08:12:14.631Z,
  mtime: 2017-06-28T08:12:14.631Z,
  ctime: 2017-06-28T08:12:14.631Z,
  birthtime: 2017-06-28T08:12:14.631Z
}
参数描述
dev文件或者目录所在设备ID
ino文件或者目录的索引编号
mode使用数值形式代表的文件或目录的权限标志
nlink文件或者目录的硬连接数量
uid文件或者目录的所有者的用户ID
gid文件或目录的所有者的组ID
rdev字符设备文件或块设备文件所在设备ID
size文件尺寸(即文件中的字节数)
atime“访问时间” - 文件数据最近被访问的时间
mtime“修改时间” - 文件数据最近被修改的时间
ctime“变化时间” - 文件状态最近更改的时间(修改索引节点数据)
birthtime“创建时间” - 文件创建的时间。 当文件被创建时设定一次
🌟 练习:删除非空文件夹
  1. 文件夹必须为空才能删除 rmdir()
  2. 删除文件夹的所有文件或文件夹
removeDir('images')
function removeDir(path){
    //读取文件夹
    var files= fs.readdirSync(path);
    //判断有没有内容
    if(files.length>0){
        //有
        for(let i=0;i<files.length;i++){
            var stats = fs.statSync(path+'/'+files[i]);
            if(stats.isFile()){
                //是文件 删除该文件
                fs.unlinkSync(path+'/'+files[i]);
            }else{
                removeDir(path+'/'+files[i])

            }
        }
    }
    fs.rmdirSync(path);
}

🌟写在最后

更多Node知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/12833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8 更换主干网络之 GhostNetV2

《GhostNetV2:Enhance Cheap Operation with Long-Range Attention》 轻量级卷积神经网络(CNN)是专门为在移动设备上具有更快推理速度的应用而设计的。卷积操作只能捕捉窗口区域内的局部信息,这防止了性能的进一步提高。将自注意力引入卷积可以很好地捕捉全局信息,但这将大…

【系统集成项目管理工程师】项目进度管理

&#x1f4a5;十大知识领域&#xff1a;项目进度管理 主要考计算题 项目进度管理包括以下 7 个过程: 规划进度管理过程定义活动过程排列活动顺序过程估算活动资源过程估算活动持续时间过程制定进度计划过程控制进度过程 一、规划进度管理过程 制定政策、程序和文档以管理项目进…

JeecgBoot 3.5.1 版本发布,开源的企业级低代码平台

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

苹果电容笔值得买吗?ipad电容笔推荐平价

在当今时代&#xff0c;高科技已经成为推动数字产品发展的重要推动力。无论是在工作上&#xff0c;还是在学习上&#xff0c;大屏幕都能起到很好的作用。IPAD将会更好地融入我们的生活&#xff0c;不管是现在还是未来。而ipad配上一支简单的电容笔&#xff0c;不仅可以提高工作…

几分种学会React Router v6使用

React路由可以实现页面间的切换。 传送门&#xff1a;英文文档 中文教程&#xff1a; https://www.reactrouter.cn/docs/getting-started/tutorial 1.基础使用 1.安装react-router npm i react-router-dom62.配置根组件app.js import { React, lazy, Suspense } from "…

C++ -3- 类和对象 (中) | 构造函数与析构函数(一)

文章目录 1.类的6个默认成员函数2.构造函数3.析构函数构造函数与析构函数应用场景缺省值初始化 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自…

【文章学习系列之模型】FEDformer

本章内容 文章概况模型流程主要结构Frequency Enhanced Decomposition Architecture&#xff08;频率增强分解结构&#xff09;Fourier enhanced blocks and Wavelet enhanced blocks&#xff08;傅里叶增强模块和小波增强模块&#xff09;Fourier Enhanced Structure&#xff…

【Java 数据结构】优先级队列 (堆)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

快速精简软件,如何让软件缩小到原来的5%大小,从删除文件入手,到修改C++引用库,合规解决存储问题

Hi~大家好&#xff0c;今天制作一个简单的精简软件的教学~ 事先说明下&#xff0c;精简软件并不违反任何规定&#xff0c;尤其是开源软件&#xff0c;这里也仅讨论开源软件的修改&#xff0c;根据几乎所有开源软件的开源规则&#xff0c;精简软件&#xff0c;本质也就是修改软件…

戴尔G3 Ubuntu18.04双系统安装

ROS学习需要使用Linux系统&#xff0c;首先就是Ubuntu&#xff0c;我选择的是18.04.6这个版本&#xff0c;因为后面我要使用以Jetson Nano为主控的Jetbot进行ROS编程&#xff0c;Jetbot所带的出厂镜像就是18.04&#xff0c;为了方便程序移植&#xff0c;以及减少不必要的麻烦。…

【消息队列】聊一下Kafka副本机制

副本机制的好处 副本在分布式系统下&#xff0c;不同的网络互联的机器保存同一份数据。我们知道在分布式系统中&#xff0c;都会通过数据镜像、数据冗余的方式来提升高可用性。 提供数据冗余&#xff1a;这点比较好理解&#xff0c;说白了就是通过数据冗余在不同的服务器上&a…

大家副业都在做什么?csgo搬砖靠谱的副业推荐给你

从来没想过&#xff0c;以前只会玩CSGO的男孩子&#xff0c;现在居然能借助游戏赚到钱了&#xff01;甚至不需要什么专业的技巧&#xff0c;简简单单 在steam平台选择有利润的道具后&#xff0c;再上架到国内网易BUFF平台&#xff0c;赚取“信息差”差价而已&#xff01; 谁大…

SpringCloud学习(六)——Feign的简单使用

文章目录 1. Feign 的使用1.1 引入依赖1.2 添加注解1.3 编写Feign客户端1.4 测试 2. Feign中的自定义配置2.1.配置文件方式2.2.Java代码方式 3. Feign 性能优化4. Feign的抽取式使用4.1 抽取配置4.2 引入依赖4.3 指明Client 在此之前&#xff0c;我们服务之间需要进行调用的时候…

读懂MAC地址

MAC地址是一种用于标识计算机网络设备的唯一地址。它是由48个二进制数字组成的&#xff0c;通常表示为12个十六进制数字&#xff0c;每两个数字之间用冒号或连字符分隔开。MAC地址由设备制造商在生产过程中分配&#xff0c;以确保网络上每个设备都有唯一的标识符。 MAC地址的规…

第11章_常用类和基础API

第11章_常用类和基础API 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串…

【大数据之Hadoop】十七、MapReduce之数据清洗ETL

ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程&#xff0c;目的是将分散、零乱、标准不统一的数据整合到一起&#xff0c;为决策提供分析依据。 ETL的设计分三部分&#xff1a;数据抽取、数据的清洗转换、数据的加载。 1 ETL体系结构 ETL主要是用来实现…

LLM总结(持续更新中)

引言 当前LLM模型火出天际&#xff0c;但是做事还是需要脚踏实地。此文只是日常学习LLM&#xff0c;顺手整理所得。本篇博文更多侧重对话、问答类LLM上&#xff0c;其他方向&#xff08;代码生成&#xff09;这里暂不涉及&#xff0c;可以去看综述来了解。 之前LLM模型梳理 …

龙芯中科官方宣布,龙芯中科企业办公信息化平台全面完成国产化替代

4月4日&#xff0c;龙芯中科官方宣布&#xff0c;龙芯中科企业办公信息化平台全面完成国产化替代。龙芯 ERP 系统全系统使用国产化平台&#xff0c;私有化部署于基于龙芯 3C5000 服务器集群的虚拟化云平台上&#xff0c;使用自研 Loongnix 操作系统、自研 LoongDB 数据库及龙芯…

【SQL Server】无需公网IP,就可以远程连接SQL Server数据库

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 1.前言 数据库的重要性相信大家…

Redis-----什么是Redis?

什么是Redis&#xff1f; redis是一个基于内存的key-value结构数据库。 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、资讯、新闻&#xff09;企业应用广泛 Redis入门 redis简介 redis是一个开源的内存中的数据结构存储系统&#xff0c;数据库…