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!

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

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

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

相关文章

【智能电网】智能电网中针对DOS和FDIA的弹性分布式EMA(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【C语言学习3——基本的C语言语法知识1】

C语言学习3——基本的C语言语法知识 主函数什么是主函数&#xff1f;写一个自己的函数主函数是整个C语言程序的入口要调用函数&#xff0c;必须先知道函数什么是变量&#xff1f; #include <stdio.h> int main() { printf("Hello World\n"); return 0; }相信你…

SpringMVC的入门案例

三层架构和mvc 三层架构&#xff1a; 我们的开发架构一般都是基于两种形式&#xff0c;一种是C/S 架构&#xff0c;也就是客户端/服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就是测览器服务器。在 avaEE开发中&#xff0c;几乎全都是基于 B/S 架构的开发。那么在 B/S…

Java语言数据类型与c语言数据类型的不同

目录 一、c语言数据类型 1.基本类型&#xff1a; 2.枚举类型&#xff1a; 3.空类型&#xff1a; 4.派生类型&#xff1a; 二、C语言编程需要注意的64位和32机器的区别 三、 不同之处 一、c语言数据类型 首先&#xff0c;先来整体介绍一下C语言的数据类型分类。 1.基…

创新,阿里首发微服务实施手册我粉了,原来微服务还可以这样玩

微服务 相信大家在网上会看到很多帖子把分布式跟微服务放在一起讨论。确实&#xff0c;微服务就是一种分布式架构的设计方法。但是&#xff0c;在微服务概念还没有出现之前&#xff0c;分布式这个概念并不能引起人们的强烈关注&#xff0c;如果说自己擅长分布式架构设计&#…

使用SeaFile搭建私有云盘并公网访问【cpolar内网穿透】

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 现在我们身边的只能设备越来越多&#xff…

面试官:String s = new String(“xyz“) 创建了几个对象?

这个问题相信每个学习 java 的同学都不陌生&#xff0c;作为一个经典的面试题&#xff0c;到现在工作这么多年了我真是认为挺操蛋的一个问题&#xff0c;在网上到现在你仍然可以看见很多讨论这个问题的人&#xff0c;其中不乏工作很多年的人都有争论&#xff0c;我认为还是有必…

一起读源码 —— Fastjson 的核心方法及其实现原理

源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库&#xff0c;它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本&#xff0c;即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压&…

贾俊平《统计学》第七章知识点总结及课后习题答案

一.考点归纳 参数估计的基本原理 1置信区间 &#xff08;1&#xff09;置信水平为95%的置信区间的含义&#xff1a;用某种方法构造的所有区间中有95%的区间包含总体参数的真值。&#xff08;2&#xff09;置信度愈高&#xff08;即估计的可靠性愈高&#xff09;&#xff0c;则…

【PMP】项目各阶段分别运用什么工具与技术汇总

做项目管理是一条漫漫长路&#xff0c;所有的本事&#xff0c;都是靠一个个项目&#xff0c;一点点积累而来的&#xff0c;并不存在“迅速上手”的方法论。一名普通项目经理的成长&#xff0c;都要经过一定时间的修炼。 数据收集 头脑风暴 在短时间内获得大量创意&#xff0…

SSM整合————单表操作基础版

一、创建数据库&#xff1a; 1. 创建一个 web 项目&#xff0c;并部署到 tomcat 服务器中测试项目 是否能够正常加载并访问首页。 2. 完善项目的结构并导入 SSM 相关的jar包 3.创建SSM框架对应的配置文件 springMVC配置文件&#xff1a;1.扫描controller&#xff1b;2.配置视图…

车企外卷:一个关于智能手机的“围城故事”

从2016年达到顶峰开始&#xff0c;全球智能手机出货量逐年下行&#xff0c;手机市场进入红海竞争逐渐成为了各界的共识。此后全球疫情与经济疲软的影响也进一步在手机市场施压&#xff0c;很多媒体认为手机产业距离“至暗时刻”已经不远。 而在去年&#xff0c;新增变数&#x…

奇葩营销之看各品牌如何玩转“营销疯学”

相信有很多人和我一样&#xff0c;最近的快乐都来自于《黑暗荣耀2》。 令人奇怪的是&#xff0c;但比起故事的主线&#xff0c;剧中妍珍等配角的”发疯”片段却成为了网友造梗的来源。 “妍珍疯驴子”“妍珍呐””“黑暗荣耀演我每天精神状态”等。让这部剧话题热度持续…

主题切换实现(vue-less)

介绍 本文适合黑白切换或者主题样式偏少的&#xff08;建议&#xff1a;2-10种&#xff09;&#xff1b;主题越多&#xff0c;样式会越多。理论上无限套。本文适合已经写好了一套主题&#xff0c;然后需求增加第二套或者多套主题&#xff08;最好小于10套&#xff0c;当然也可…

8、ThingsBoard使用docker compose集群部署的问题以及如何解决问题

1、问题回顾 接着上一节继续讲解,上一节我们把整个服务全部都运行起来了,但是访问页面报错,最后查看的问题是前端的容易里面报错: 然后执行脚本删除所有的容器 2、问题分析 当遇到这个问题的时候,我当时真的不知道如何去解决,然后我又尝试使用官方的镜像来部署,发现官…

ASM字节码处理工具原理及实践(一)

1. ASM简介 我们知道程序的分析。生成和转换是很有用的技术&#xff0c;可以用于很多场景。ASM作为一个Java字节码处理工具&#xff0c;它被设计用于处理已编译的Java类。ASM不是生成和转变已编译的Java类的唯一工具&#xff0c;但它是最新且最有效的工具之一。特点是体积小&a…

wsl的图像化实现,在wsl中启动浏览器

最近在学习wsl&#xff0c;原本我看以前的教程说wsl和vmware的区别有一点就是&#xff0c;wsl只能使用命令行&#xff0c;而vmware可以实现图像化&#xff0c;结果我在 microsoft 官方发现现在的wsl 2已经实现了 GUI 界面&#xff0c;所以就来记录一下吧。 wsl 的 GUI 实现 首…

web后端-请求响应

概述 我们之前在Spring写的 Java类&#xff0c;因为没有继承任何的接口 所以tomcat其实是不识别的&#xff0c;也不能直接运行 但是tomcat识别JavaEE的一项规范-Servlet,因为tomcat就相当于一个Servlet容器 SpringBoot底层提供了一个DisPatcherServlet类(实现了servlet接口)…

【linux】 安装 java 环境

目录 1.检查linux 下是否安装java(jdk)环境2.查看 linux 的操作系统版本3.下载jdk4.新建java文件夹用于安装jdk5.将下载到本地的jdk压缩包上传到linux服务器6.配置环境变量 1.检查linux 下是否安装java(jdk)环境 可通过下面五条命令来查看linux 系统是否安装了java 环境 1、jav…

建筑行业为什么要数字化转型?

建筑行业为什么要数字化转型&#xff1f; 建筑行业作为国民经济的重要支柱产业之一&#xff0c;其生产过程繁琐、复杂&#xff0c;且产业链条长&#xff0c;涉及众多领域。 然而&#xff0c;目前传统的建筑模式已经无法适应行业的发展需求&#xff0c;建筑行业的数字化转型已…