四、fs文件系统模块

news2024/9/28 19:15:17

         fs模块是Node.js官方提供用来操作文件的模块,属于核心模块,提供了一些列的方法和属性,用来满足用户的操作需求;

引入fs模块

const fs = require('fs');

fs.readFile() 读取

        读取指定的内容,fs.readFile(path[,options],callback) '[ ]'为可选参数 ;path是文件路径,options是用什么编码格式读取文件,callback是读取完成之后通过回调的形式拿到读取失败err和成功dataStr的结果;

// read.txt
被读取的文件
// readFile.js文件
const fs = require('fs');
fs.readFile('./read.txt','utf8',function(err,dataStr){
    console.log(err);         // 读取成功err的值为 null,
    console.log(dataStr);     // 读取dataStr失败,dataStr为undefined
})

文件是否读取成功?

const fs = require('fs');
fs.readFile('./read.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取失败:'+err.message);
    }
    console.log('读取的内容:'+dataStr);
})

 将读取的文件名称改掉,使其读取错误结果:read.txt => reads.txt ,没有该文件;


fs.writeFile() 写入

        写入指定内容,fs.writeFile(file,data[,options],callback),file表示文件的存放路径,data是写入的内容,options是编码格式(默utf8),callback完成后回调函数;

const fs = require('fs');
// 往read.txt内写入
fs.writeFile('./read.txt','写入syan123',function(err){
    console.log(err);    // 写入成功err的值为null
})

 判断是否写入成功?

const fs = require('fs');
// 往read.txt内写入
fs.writeFile('./read.txt','写入syan123',function(err){
    if(err){
        console.log("写入失败:"+err.message);
    }
    console.log("写入成功!")
})

fs.writeFile 注意

fs.writeFile() 方法只能用来创建文件,不能创建路径;

重复调用fs.writeFile() 写入同一个文件,新写入的内容会覆盖掉之前的内容;


 文件路径问题

        使用fs.readFile()或者fs.writeFile()中的path路径都是相对路径 ' ./read.txt ',这种方式会出现路径错误的问题:在运行node xx.js 文件时,会在当前所处目录去动态拼接完成路径;

 如以下这样运行的话,路径的拼接就会出现错误,以致于读取失败;        

         这样一来可以通过完整的路径来进行文件的读取,就能够避免掉出现路径拼接出现错误的文体,但带来的是文件的【移植性】会变得很差,不利于维护,如下:

const fs = require('fs');
fs.readFile('C:\\Users\\Administrator\\Desktop\\node\\Node\\fs模块\\read.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取失败:'+err.message);
    }
    console.log('读取的内容:'+dataStr);
})

        既然动态的拼接会出现问题,使用完成路径导致文件移植性和维护性差点问题,可以通过以下这种方式 __dirname 表示当前文件所处的目录文件再动态的拼接路径


 __dirname 解决路径问题

const fs = require('fs');
fs.readFile( __dirname + '/read.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取失败:'+err.message);
    }
    console.log('读取的内容:'+dataStr);
    console.log('读取目录路径:'+ __dirname);
})


文件的打开模式有以下几种:

'a'打开文件用于追加。若文件不存在,则创建该文件。
'a+'打开文件用于读取和追加。若文件不存在,则创建该文件。
'as+'

打开文件用于读取和追加(在同步模式中),若文件不存在,则创建该文件。

'r'打开文件用于读取。若文件不存在,则会发生异常。
'rs+'

打开文件用于读取和写入(在同步模式中),指示操作系统绕过本地的文件系统缓存。

'w+'

打开文件用于读取和写入。如果文件不存在则创建文件,若文件存在则截断文件。

fs.openSync() 打开文件 —— 同步

        同步打开文件,fs.openSync(path,[flags,mode]),flag是文件系统flag支持,默认是'r';

// openSync.js文件
const fs = require('fs');
const fd = fs.openSync( __dirname + '/read.txt','r');
console.log(fd);    // fd 文件描述符

返回值为:<number>,表示文件描述符的整数;

fs.open() 打开文件 —— 异步

        异步打开文件,fs.open(path,[flags,mode],callback),有callback回调;

// open.js文件
const fs = require('fs');
fs.open(__dirname+'/reads.txt','r',function(err,fd){
    if(err){
        return console.log('文件打开失败!');
    }
    // fd是文件描述符,文件标识
    console.log(fd);
})

         同步和异步打开文件都有返回值<number>表示文件描述符的整数,区别在于异步打开文件有两个回调函数(err,fd),err是异常的错误信息,fd是打开文件后的标识;对应的有同步/异步的打开文件,就有同步和异步的关闭文件;


fs.closeSync() 关闭文件 —— 同步

        同步关闭文件,fs.closeSync(fd),fd为文件关闭的标识;通过fs.openSync() 同步打开文件能获得打开文件的标识返回值 <number> ,同步关闭文件可以通过fs.closeSync(fd) 根据打开文件的标识来关闭;

fs.close() 关闭文件 —— 异步 

        异步关闭文件,fs.close(fd,callback),异步关闭会有callback回调,内部有1和异常参数err;

// close.js文件
const fs = require('fs');
// 打开文件后关闭
fs.open( __dirname + '/read.txt','r',function(err,fd){
    if(err){ 
        return console.log('文件打开失败!');
    }
    fs.close(fd,function(fd,err){
        if(err) throw err;
        console.log('文件正常关闭');
    })
})


 fs.appendFile() 文件追加

        向文件追加内容,fs.appendFile(file,data[,options],callback) ,data是要追加的文件内容,可以是String(字符串)或者buffer(流)对象;现在就往read.txt文件内去追加内容:

// appenFile.js 文件
const fs = require('fs');
const content = '追加的数据内容:syan123';
fs.appendFile(__dirname+'/read.txt',content,function(err){
    if(err){
        return console.log(err);
    }
    console.log('append成功!')
})


fs.unlinkSync() 删除文件 —— 同步

        同步方式删除,fs.unlinkSync(path),返回值是undefined;

// unlinkSync.js文件 —— 观察read.txt文件
const fs = require('fs');
const rs = fs.unlinkSync( __dirname + '/read.txt');
console.log(rs);    // undefined

fs.unlink() 删除文件 —— 异步

        异步方式删除,fs.unlink(path,callback);

// unlink.js文件 —— 观察read.txt文件
const fs = require('fs');
fs.unlink(__dirname + '/read.txt',function(err){
    if(err){
        return console.log('unlink失败');
    }
    console.log('unlink成功');
})


目录操作

fs.mkdir() 创建目录

        创建目录操作,fs.mkdir(path,[mode],callback);mode设置目录权限,默认为0777;

// mkdir.js文件 —— 观察是否出现demo
const fs = require('fs');
fs.mkdir( __dirname + '/demo',function(err){
    if(err){
        return console.log("创建失败!");
    }
    console.log("创建成功!");
})

fs.readdir() 读取目录 

        读取目录操作,fs.readdir(path[,options],callback),异步读取目录内容,options是可以是编码也可以是encoding,encoding为'buffer',返回文件名作为buffer对象传入;callback有两个参数(err,files),err是异常出错的信息,files是目录中文件名称的数组;先在demo文件下面定义两个文件:fileOne.js 和 fileTwo.js ,通过回调中的files获取目录下的文件名称数组;

// readdir.js文件
const fs = require('fs');
fs.readdir(__dirname+'/demo',function(err,files){
    if(err){
        return console.log(err);
    }
    console.log(files);
})

打印出在demo目录下的文件名称数组 [ 'fileOne.js' ,'fileTwo.js' ] ;

fs.stat() 查看目录

        查看目录及文件信息,fs.stat(path,callback),可以通过callback中的参数stats访问文件属性

// stat.js 文件
const fs = require('fs');
fs.stat(__dirname + '/demo',function(err,stats){
    if(err) throw err;
    console.log(stats);
})


检查目录是否存在

        异步检查目录,fs.exists()已经是被废弃掉了的API,使用同步的方式检查,fs.existsSync();

// existsSync.js 文件
// 检查目录是否存在
const fs = require('fs');
const rs =  fs.existsSync(__dirname + '/demo')
console.log(rs);


fs.rmdir() 删除目录 

        删除目录,前提是目录必须是空的,不能包含任何文件;fs.rmdir(path,callback);将demo目录文件删除掉,然后将demo目录删除掉;

// rmdir.js文件
const fs = require('fs');
fs.rmdir(__dirname + '/demo',function(err){
    if(err){
        return console.log("删除demo目录失败!");
    }
    console.log("删除成功!");
})

删除有文件的目录

        删除含有文件的目录,通过先删除文件可以fs.unlink(),再通过fs.rmdir()可以删除空目录即可;下面来删除demo目录,demo目录下还有两个文件fileOne.js和fileTwo.js;

// demo.js文件
const fs = require('fs');
// 读取目录信息
fs.readdir(__dirname + '/demo',function(err,files){
    if(err) throw err;
    console.log("files文件:",files);
    // 删除文件
    files.forEach(function(file){
        console.log(file);
        fs.unlink(__dirname+'/demo/'+file,function(err){
            console.log(__dirname+'/demo'+file);
            if(err){
                return console.log("删除文件失败!");
            }
            console.log("删除文件成功!");
        })
    })
    // 删除目录
    fs.rmdir(__dirname+'/demo',function(err){
        if(err){
            return console.log("目录删除失败!");
        }
        console.log("目录删除成功!");
    })
})

        以上就是关于Node.js中的fs文件操作模块的一些基础内容,当然关于fs模块的内容不止这些,还有其他结合buffer的一些内容,比如还有一些读写fs.read() 和fs.write() 等的一些方法!在后续的内容相继来讲!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图文排版 之 line-height

图文排版 之 line-height 设置行盒子的高度. line-height 经常被用来设置多行文本的行间距. 对于块级元素, line-height 制定了行盒子的最小高度. 对于非替换的内联元素, line-height 的值用来计算行盒子的高度. 一般来说, 大家都知道一个 div 的高度默认是由其子元素撑起的, …

史上最全 Java 高频面试合集,命中率高达 95%

进大厂是大部分程序员的梦想&#xff0c;而进大厂的门槛也是比较高的&#xff0c;所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全&#xff0c;其中概括的知识点有&#xff1a;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、 Redis、MySQL、Spring、S…

现代控制理论

系统的状态空间表达式的建立 建立系统状态空间表达式的三种方法 &#xff08;1&#xff09;根据系统的方框图列写 &#xff08;2&#xff09;从系统的基本原理推导 &#xff08;3&#xff09;根据传递函数或者高阶微分方程实现 方框图法 有些系统的系统机理还没搞清楚可以使…

nodejs+vue高校教室管理系统

摘 要 1 1 系统概述 4 1.1研究背景 4 1.2研究现状 4 1.3主要内容 5 2 系统开发环境 6 2.3 MySql数据库 6 2.4 B/S结构 7 3 需求分析 8 3.1技术可行性&#xff1a;技术背景 8 3.2经济可行性 8 3.3操作可行性 8 3.4系统设计规则 9 3.5系统流程和逻辑 9 4系统概要设计 13 4.1 概…

Delaunay三角网之分治算法

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Delaunay三角网现有的构网算法有很多种,有学者曾对其中一些算法进行了调查和评估(如下图所示)。结果表明,在少量点时,Lawson的增量插入算法、Lee和Schachter的分治算法以及Fortune的平面扫描算法在速度上大致相…

Hexo+stun主题+Gitee5分钟快速搭建你的个人Blog

环境配置 首先要下载Node.js&#xff0c;然后安装Git&#xff0c;接着注册码云&#xff0c;最后安装Hexo&#xff0c;Hexo安装命令行(cmd 或 gitbash): npm install hexo-cli -g速度慢可以先改一下安装源: npm config set registry https://registry.npm.taobao.orgHexo搭建 目…

Linux调试器-gdb介绍

文章目录gdb的基础使用gdb是什么gdb的使用gdb的下载**l 显示代码****b 行号 :打断点****info b :查看断点****d 断点序号 :删除断点****r :运行调试****n&#xff08;next&#xff09; &#xff1a;逐过程****s&#xff08;step&#xff09;&#xff1a;逐语句****c&#xff08…

程序员接私活的那些事

每日坚持一点点&#xff0c;就离目标近一点。 文章目录怎么在空闲时间获得格外的收入接私活的有哪些途径接私活的途中需要注意什么格外福利怎么在空闲时间获得格外的收入 今天我们就不聊技术问题&#xff0c;咱们聊聊一个有意思的话题—>怎么在空闲的时间获得格外的收益&…

设计模式3 - 结构型模式

23种设计模式分析与见解开篇、UML、软件设计原则https://blog.csdn.net/lili40342/article/details/128358435创建型模式https://blog.csdn.net/lili40342/article/details/128358392结构型模式https://blog.csdn.net/lili40342/article/details/128358313行为型模式https://bl…

UNIAPP实战项目笔记54 登录时用state存储用户信息并持久化用户登录和退出登录功能

UNIAPP实战项目笔记54 登录时用state存储用户信息并持久化用户登录和退出登录功能 登录信息各个页面同步使用的是state 登录信息的持久化使用的是本地存储 打开APP自动初始化本地存储数据到state中 实际案例图片 登录页面数据渲染 代码 login.vue页面 登录成功后显示的页面 &l…

论文阅读 - Social Bot-Aware Graph Neural Network for Early Rumor Detection - CCF B

目录 摘要&#xff1a; 1 绪论 2 问题定义 3 SBAG模型 3.1社交机器人检测 3.2 机器人感知图神经网络 3.2.1基于GCN的用户发布 3.2.2 基于GAT的用户交互 3.2.3文本编码器 3.2.4 输出层 3.3 训练 4 实验 4.1 数据集 4.2 实验设置 4.3 基线 4.4 实验结果 4.4.1 谣言…

对时间序列数据(牛仔裤销售数据集)进行LSTM预测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 LSTM模型的一个常见用途是对长时间序列数据进行学习预测&#xff0c;例如得到了某商品前一年的日销量数据&#xff0c;我们可以…

【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解近似值(NVSHMEM)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

MyBatis + SQL Server Using Table-Valued Parameters

一、实现原理 参考文档 Using table-valued parametersSystem requirements for the JDBC driverMicrosoft JDBC Driver for SQL Server1、微软官方封装了 JDBC 驱动 jar 包&#xff0c;提供 SQLServerDataTable 类&#xff1b; 2、Mybatis 官方提供自定义类型处理接口 TypeHa…

Python学习笔记-Pygame

目录 一、Pygame概述 1.安装Pyganme 2.Pygame常用模块介绍 2.1 display模块常用方法 2.2 pygame.event模块常用方法 2.3 Surface对象的常用方法 记述关于Pyganme开发的基本知识。 一、Pygame概述 Pygame是跨平台的python模块&#xff0c;转为电子游戏设计&#xff08;包…

Vue打包后的不同版本解析

vue源码打包版本 这里选取我们开发中常见的几个版本进行说明。 1、vue(.runtime).global(.prod).js 在html页面中通过 <script src“...”> 标签直接使用。通过CDN引入和npm下载的Vue就是这个版本。会暴露一个全局的Vue来使用。&#xff08;.runtime&#xff09;和&…

2022年12月python的字符串常用操作

字符串在整整个开发的过程中&#xff0c;使用频率相对来说是较高的。 在此总结几个字符串的常用操作&#xff0c; 字符串的操作&#xff0c;转换后即生成为新字符串 【长度统计 切片&#xff1a; 【 根据索引进行切片str[开始索引:结束索引:步长] 根据指定标识符进行切片str.sp…

【码极客精讲】桶排序

桶排序 (Bucket sort)或所谓的箱排序&#xff0c;是一个排序算法&#xff0c;工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序&#xff08;有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序&#xff09;。桶排序是鸽巢排序的一种归纳结果。当要被排…

【硬币识别】形态学硬币计数【含Matlab源码 683期】

⛄一、硬币图像识别简介 本设计为硬币图像识别统计装置&#xff0c;通过数码相机获取平铺无重叠堆积的硬币的图像&#xff0c;并通过Matlab工具处理后统计硬币的数目。 1 图像格式转换 取的图像格式为RGB彩色图像&#xff0c;需要先将其转换为8位256级的灰度图像。本程序采用…

SAP Gateway 里的 REST 概念

SAP Gateway 有助于轻松配置和使用 SAP Business Suite 系统的业务逻辑和内容&#xff0c;用于移动和 Web 应用程序。它降低了访问 SAP 数据所需的复杂性和技能组合&#xff0c;从而消除了部署障碍。使用简单的界面有助于缩短开发时间。 SAP Gateway 使以人为本的应用程序能够…