前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【快速复习】Node.js中的fs模块的使用

【快速复习】Node.js中的fs模块的使用

作者头像
张张
修改于 2020-03-09 09:32:16
修改于 2020-03-09 09:32:16
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

JavaScript 的是没有操作文件的能力,但是 Node 是可以做到的,Node 提供了操作文件系统模块,是 Node 中使用非常重要和高频的模块,是绝对要掌握的一个模块系统。

fs 模块提供了非常多的接口,这里主要说一下一些常用的接口。

1.常用API快速复习

fs.stat 检测是文件还是目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.stat('hello.js', (error,stats)=>{
    if(error) {
        console.log(error)
    } else {
        console.log(stats)
        console.log(`文件:${stats.isFile()}`)
        console.log(`目录:${stats.isDirectory()}`)
    }
})

fs.mkdir 创建目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
onst fs = require('fs')
fs.mkdir('logs', error => {
    if(error) {
        console.log(error)
    } else {
        console.log('目录创建成功!')
    }
})

fs.rmdir 删除目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.rmdir('logs', error => {
    if(error) {
        console.log(error)
    } else {
        console.log('成功删除了目录 logs')
    }
})

fs.writeFile 创建写入文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.writeFile('logs/hello.log','您好~\n', error => {
    if(error) {
        console.log(error)
    } else {
        console.log('成功写入文件');
    }
})

fs.appendFile 追加文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.appendFile('logs/hello.log','hello~\n', error => {
    if(error) {
        console.log(error)
    } else {
        console.log('成功写入文件');
    }
})

fs.readFile 读取文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.readFile('logs/hello.log','utf-8', (error, data) => {
    if(error) {
        console.log(error)
    } else {
        console.log(data);
    }
})

fs.unlink 删除文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.unlink(`logs/${file}`, error => {
    if(error) {
        console.log(error)
    } else {
        console.log(`成功删除了文件: ${file}`)
    }
})

fs.readdir 读取目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.readdir('logs', (error, files) => {
    if(error) {
        console.log(error)
    } else {
        console.log(files);
    }
})

fs.rename 重命名,还可以更改文件的存放路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
fs.rename('js/hello.log', 'js/greeting.log', error => {
    if(error) {
        console.log(error)
    } else {
        console.log('重命名成功')
    }
})

2.第三方NPM包 mkdirp 的使用

mkdirp 不仅可以创建文件夹,还可以创建多层的文件夹,类似 mkdir -p 命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	
midir -p tmp/foo/bar/baz

上述命令也可以在当前目录创建多层几文件夹。

如下代码在当前目录生成多层级文件夹

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const mkdirp = require('mkdirp')
mkdirp('tmp/foo/bar/baz').then(made => console.log(`创建目录于: ${made}`))
// 创建目录于: /Users/zhangbing/github/CodeTest/Node/fs/tmp

结果

3.实战举例

实战1

判断服务器上面有没有 upload 目录。如果没有就创建这个目录,如果有的话不做操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
const path = './upload'
fs.stat(path, (err, data) => {
    if(err) {
        // 执行创建目录
        mkdir(path)
        return
    }
    if(data.isDirectory()) {
        console.log('upload目录存在');
    }else{
        // 首先删除文件,再去执行创建目录
        fs.unlink(path, err => {
            if(!err) {
                mkdir(path)
            }
        })
    }
})
function mkdir(dir) {
    fs.mkdir(dir, err => {
        if(err) {
            console.log(err);
            return
        }
    })
}

实战2

wwwroot 文件夹下面有 images css js 以及 index.html, 找出 wwwroot 目录下面的所有的目录,然后放在一个数组中

使用同步方法方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
const path = './wwwroot'
const dirArr = []
const dirs = fs.readdirSync(path)
dirs.forEach(item => {
    if(fs.statSync(path + '/' + item).isDirectory()) {
        dirArr.push(item)
    }
})
console.log('dirArr', dirArr)
// dirArr [ 'css', 'images', 'js' ]

使用 async/await 方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs')
const path = './wwwroot'
const dirArr = []
function isDir(path) {
    return new Promise((resolve, reject) => {
        fs.stat(path, (error, stats) => {
            if(error) {
                console.log(error)
                reject(error)
                return
            }
            if(stats.isDirectory()) {
                resolve(true)
            } else {
                resolve(false)
            }
        })
    })
}
function main(){
    fs.readdir(path, async (error, data) => {
        if(error) {
            console.log(error)
            return
        } else {
            for(let i = 0; i < data.length; i++) {
                if(await isDir(path + '/' + data[i])) {
                    dirArr.push(data[i])
                }
            }
            console.log('dirArr', dirArr)
        }
    })
}
main() // dirArr [ 'css', 'images', 'js' ]

4.管道流

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require("fs")
//创建一个可读流
const readerStream = fs.createReadStream('input.txt')
//创建一个可写流
const writerStream = fs.createWriteStream('output.txt')
//管道读写操作
//读取input.txt文件内容,并将内容写入到output.txt文件中
readerStream.pipe(writerStream)
console.log("程序执行完毕")

fs.createReadStream 从文件流中读取数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
onst fs = require('fs')
const fileReadStream = fs.fileReadStream('demo1.js')
let count = 0
let str = ''
fileReadStream.on('data', chunk => {
    console.log(`${++count}接收到:${chunk.length}`)
    str += chunk
})
fileReadStream.on('end', () => {
    console.log('---结束---')
    console.log(count + ',' + star)
})
fileReadStream.on('error', error => {
    console.log(error)
})

fs.createWriteStream 写入文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require("fs")
const data ='我是从数据库获取的数据,我要保存起来'
//创建一个可以写入的流,写入到文件output.txt中
const writerStream = fs.createWriteStream('output.txt')
//使用utf8编码写入数据
writerStream.write(data,'UTF8')
//标记文件末尾
writerStream.end()
//处理流事件-->finish事件
writerStream.on('finish', () => {
    /*finish-所有数据已被写入到底层系统时触发。*/
    console.log("写入完成。")
})
writerStream.on('error', err => {
    console.log(err.stack);
})
console.log("程序执行完毕")

实战:复制图片

在项目根目录有一张图片2020.png,把它复制到 /wwwroot/images

代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require("fs")
const readStream = fs.createReadStream('./2020.png')
const writeStream = fs.createWriteStream('./wwwroot/images/2021.png')
readStream.pipe(writeStream)

需要特别注意的是,fs.createWriteStream 要写入的目录一定要带上要复制的文件名,也就是不能写成 fs.createWriteStream('./wwwroot/images/') 否则在 macOS 下会报如下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error: EISDIR: illegal operation on a directory, open <directory>

本文源码:https://github.com/dunizb/CodeTest/tree/master/Node/fs

本文首发于博客:https://cloud.tencent.com/developer/article/1595112

如果对你有一点点帮助,可以点个关注。

作者简介:做工程不做码农(微信公众号同名),Web前端工程师,坐标杭州,聚焦大前端技术的公众号,分享我的原创或精选文章,欢迎关注。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ONOS发布新版SDN操作系统Junco
在上周的开放网络峰会上,ON.Lab主导的开源项目ONOS发布了新的版本Junco,ON.Lab和ONF表示该版本的ONOS操作系统目前已经在多个实验室和现场试验中运行,并且在上周的ONS大会上加以演
SDNLAB
2018/03/29
6850
SDN初创公司Plexxi及其产品介绍
编者按:随着软件定义网络(SDN)技术的不断发展,SDN业界相当多的创业公司变得越来越炙手可热。打铁还需自身硬,SDN初创公司Plexxi凭借完整优秀的SDN解决方案,在成立不久便获得了相当可观的风投资金,成为业界初创公司获得成功的典范。 2013年12月份SDN初创公司Plexxi,挟数百万美元的风险投资出现在人们的视野里,并同时推出第一批SDN交换机。这家公司的总部在马萨诸塞州剑桥。自12月份公开后一直动作频频。期间推出了众多SDN交换机、控制器及基于SDN的网络解决方案。本文小编就给大家介绍一下,Pl
SDNLAB
2018/04/04
8580
SDN初创公司Plexxi及其产品介绍
ONOS调研报告
1 SDN简介和组成部分 SDN即软件定义网络(Software Defined Network, SDN ),是emulex网络一种新型网络创新架构,是网络虚拟化的一种实现方式,其核心技术openf
SDNLAB
2018/04/03
1.2K0
ONOS调研报告
ONOS白皮书中篇之ONOS架构
编者按:本系列分三篇对ONOS白皮书进行翻译,接《ONOS白皮书上篇》,本文翻译白皮书中的第5部分ONOS架构,如有不当之处,欢迎指正。 5.ONOS架构 ONOS从一开始就从服务提供商的角度开展架构
SDNLAB
2018/04/04
2.3K0
ONOS白皮书中篇之ONOS架构
如何提高SDN可拓展性
Software Defined Networking是一种控制平面和数据平面分离的可编程的网络架构,目前已经有许多商业落地案例。在部署SDN时,往往会因SDN控制器性能不足而限制了SDN的可拓展性。
SDNLAB
2018/04/03
1.2K0
如何提高SDN可拓展性
白盒交换机操作系统混战
白盒交换机的出现给了用户选择最佳软硬件平台的权利,它仅仅提供交换机硬件和ONIE(开放网络安装环境),用户可以自行选择最合适的交换机芯片,降低成本实现最大效益。但是白盒交换机没有软件是无法使用的,因此每个白盒交换机都需要一个操作系统,用于管理交换机硬件和软件。这个OS往下能整合所有芯片硬件,往上又能衔接所有应用。
SDNLAB
2018/08/16
3.1K0
白盒交换机操作系统混战
SDN之NOS概述
网络操作系统(NOS)是一个用于配置和控制白盒交换机网络的平台,其核心职责是监控交换机的状态(例如,检测端口和链路故障),维护反映当前网络状态的拓扑的全局视图,并使其对控制应用(Control Apps)可用,控制应用依次“指示”网络操作系统根据它们提供的服务来控制通过底层交换机的数据包流量。本文通过ONOS来介绍NOS的总体结构。
SDNLAB
2020/06/28
1.7K0
SDN之NOS概述
ONOS高可用性和可扩展性实现初探
ONOS的发布直面OpenDaylight 进行挑战,直接将 SDN领域两大阵营(运营商和设备商)的竞争瞬间升级,之所以 ONOS能做到这一点,首先,ONOS的定位就是要为运营商提供敏捷和灵活的大规模部署能力,避开了设备商围绕着 OpenDaylight展开的品牌保卫战。另外, ONOS实现了高可用、可扩展的系统设计方案,基于此基础上对系统的层次结构以及网络实体进行高度抽象,这种优秀的设计和高度的抽象保障了系统的演进和能够被优化得更快更有效。这篇文章主要探寻 ONOS在HA 和Scale-out的设计上的一
SDNLAB
2018/04/04
8380
ONOS高可用性和可扩展性实现初探
【双语频道】6分钟了解ONOS
本视频来自ONOS首席架构师Thomas Vachuska的讲解,视频在短短6分钟左右的时间内深入浅出的对ONOS的架构进行了阐述和分析,并对其功能进行了演示。该视频对于ONOS用户宏观的掌握ONOS
SDNLAB
2018/04/02
8350
【双语频道】6分钟了解ONOS
软件定义网络(SDN)基础概念学习笔记(下)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/03
9780
软件定义网络(SDN)基础概念学习笔记(下)
Pingping Lin:ONOS-面向运营商网络的SDN操作系统
第五届中国未来网络发展与创新论坛12月10日-11日在南京盛大开幕,美国开放网络实验室(ON.Lab)技术总监Pingping Lin发表精彩演讲,以下为演讲实录。 Pingping Lin:大家好,我今天讲的是面向运营商的网络系统——ONOS。今天我主要从以下几个方面来介绍,首先简单介绍一下我们公司ON.Lab,然后介绍我们公司的产品。ON.Lab公司一开始主要由几个教授最初提出了SDN,后又成立了这个实验室。我们ON.Lab这个公司,可能大家对这个公司的产品已经很熟悉了,比如说经常使用的Mininet,
SDNLAB
2018/04/03
7890
Pingping Lin:ONOS-面向运营商网络的SDN操作系统
ONOS发布1.2版本Cardinal——专注可扩展性
开源软件定义网络(SDN)项目ONOS公布1.2版本——Cardinal,并声称其软件平台在多协议支持、性能增强、APIs方面支持范围更广。 添加的新功能主要包括IPv6全协议支持、改进北向接口、管理
SDNLAB
2018/04/03
9140
ONOS发布1.2版本Cardinal——专注可扩展性
基于SDN网络的QoS机制研究(上)
蒋暕青,华东师范大学研究生学历,先后于思博伦通信、上海宽带技术及工程研究中心、九州云就职。
SDNLAB
2020/06/19
1.6K0
David Lenrow:ONOS社区及平台介绍
大家下午好!我是为华为工作的,但是今天,我是作为ONOS推广大师来为大家谈一下ONOS的社区以及它的平台。ONOS是一个开放的网络操作系统,我想,它可能就是像一个SDN控制器,大家可以直接把它当成一个SDN的控制器,它是一个网络操作系统。SDN控制器是我们今天讲的重点了。它其实,和OpenDaylight也很类似,我们的使命是一个服务提供商,这是我们ONOS强调一个独特的重点。我们的历史,是非常有意思的。这个项目最初由一家企业倡议的。也就是我们的系统的基础来自一个非常小的团队。它们建立起了东西,还要把它们做
SDNLAB
2018/04/02
6050
David Lenrow:ONOS社区及平台介绍
【每日播报】ONOS预热篇之ONOS简介
1 ONOS诞生背景 1.1 ONOS诞生的利益分析 随着移动设备的不断普及,OTT服务和内容分发的兴起导致服务提供商网络迫切的需要一次网络变革。为了应对日益增长的带宽需求,服务提供商希望网络可以更加敏捷高效,且能从创新型服务和新型业务模式中分一杯羹得到更好的发展,至此SDN的呼声越来越高。而SDN中控制器占重要部分,是兵家必争之地,陆陆续续已经出现了很多SDN控制器,如OpenDaylight、OpenContrail、Ryu、Floodlight、NOX、SPOX等等,其中最受瞩目的莫过于OpenDay
SDNLAB
2018/04/04
9510
【每日播报】ONOS预热篇之ONOS简介
SDN控制平面发展历史及趋势
SDN的特点之一就是控制平面与数据平面分离,其主张通过集中式的控制器平台实现网络的控制。在SDN架构中,控制平面是逻辑集中的,通过某种协议将控制信息下发至底层的数据平面去执行。所以,控制平面被称为SD
SDNLAB
2018/04/03
1.4K0
SDN控制平面发展历史及趋势
云计算数据中心(一)
  云计算基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。将云计算与数据中心有效结合实现了优势互补。 云数据中心应具备以下几个特征。
Francek Chen
2025/01/23
1630
云计算数据中心(一)
【SDN软件定义网络】-1:SDN+Mininet+Ryu+OpenFlow 相关概念简介
SDN(Software-Defined Networking,软件定义网络)是一种网络架构理念,它使得网络设备(如交换机和路由器)的控制功能与数据转发功能分离。这种分离使得网络的配置和管理更加灵活和自动化,从而提高网络的可扩展性和可编程性。
程序员洲洲
2024/08/09
4720
【SDN软件定义网络】-1:SDN+Mininet+Ryu+OpenFlow 相关概念简介
网络层控制平面
**路由: 按照某种指标(传输延迟,所经过的站点数目等)找到一条 从源节点到目标节点的较好路径 **
用户11097514
2024/05/31
1950
网络层控制平面
【8点20】ONOS预热篇之ONOS与OpenDaylight比较(四)
目前以设备提供商为代表的OpenDaylight阵营目前发展势头正劲,而由斯坦福大学和加州大学伯克利分校SDN先驱创立的非营利性组织ON.Lab也紧锣密鼓地推出了自己的开源SDN操作系统——ONOS。此次打造的商业级的以用户为导向的ONOS开放网络操作系统是以服务提供商为首,并且得到了开放网络基金会ONF的鼎力支持,意欲与OpenDaylight一决高下。具体的性能究竟孰好孰坏还需要等待发布之后的评测,下面小编就从不同的方面比较一下这两个业界最知名的网络操作系统。 1. 驱动方式不同 ONOS白皮书中写道,
SDNLAB
2018/04/04
9660
【8点20】ONOS预热篇之ONOS与OpenDaylight比较(四)
相关推荐
ONOS发布新版SDN操作系统Junco
更多 >
LV.1
自动驾驶ADAS深度学习工程师
目录
  • 1.常用API快速复习
    • fs.stat 检测是文件还是目录
    • fs.mkdir 创建目录
    • fs.rmdir 删除目录
    • fs.writeFile 创建写入文件
    • fs.appendFile 追加文件
    • fs.readFile 读取文件
    • fs.unlink 删除文件
    • fs.readdir 读取目录
    • fs.rename 重命名,还可以更改文件的存放路径
  • 2.第三方NPM包 mkdirp 的使用
  • 3.实战举例
    • 实战1
    • 实战2
  • 4.管道流
    • fs.createReadStream 从文件流中读取数据
    • fs.createWriteStream 写入文件
    • 实战:复制图片
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档