Node.js - fs.path模块
首先我有话说,是谁说的学完ajax就可以去vue了,太天真了我,学会js钻出来个ajax,学完ajax钻出来个node.js这一步步的,当然node不会学到太深入把表面的认识一下就可以了,这之后可能更新速度要慢一点了,因为这几天会把时间花在论文上,马上要进入答辩了,虽然我现在那是有非常的浓厚的兴趣想见识一下node的姿态啊。进入正题吧
1.
今天首先介绍一下什么是node.js?
node.js是一个基于Chrome V8引擎的js运行环境,注意是一个运行环境,浏览器是js前端的运行环境,而我们node就是js后端的运行环境,并且在node.js中无法调用DOM、BOM以及ajax的一些api。
怎么来学习node.js呢?
就跟我们js学习一样,先基础语法再webapi。node是先js基础语法,然后再node.js内置api(fs、path、http等)再去第三方的api(express、mysql等)
怎么用node来执行js?
通过终端来实现,win+r打开cmd然后cd进入js文件所在的目录在执行node js文件名.js
更简便方法,直接进入这个目录然后按住shift+右键鼠标找到打开shellpower直接可运行node。当然我实在vscode上可以直接运行终端还多方便的
2.
进入我们今天第一个学习目标,fs文件系统模块,这是一个操作文件的模块。想要使用它必须先得导入,当然在这些node内置的api都是安装node的时候就有的你只需要导入即可
在这个模块里面有两个方法第一个是读取指定文件内容
fs.readFile(path【,options】,callback)
path:文件的路径
options: 以什么样的编码来读取文件
callback:读取后的回调函数
const fs = require('fs')
fs.readFile('./file/read.txt', 'utf-8', function(err, dataStr) {
console.log(err);
console.log(dataStr);
})

const fs = require('fs')
fs.readFile('./file/errread.txt', 'utf8', (err, dataStr) => {
if (!err) {
return console.log('读取成功' + dataStr);
}
return console.log('读取失败' + err.message);
})
其中在这里面err=null表示读取成功且此时dataStr就为里面的内容,否则就读取失败
既然有读取那就有写入,写入文件内容
fs.writeFile(path,data[,options],callback)
path:写入文件的地址 注意 :这个地址可以拿来创建文件但不能创建目录
data:写入的数据
const fs = require('fs')
fs.writeFile('./file/write.txt', 'hello fswrite', err => console.log(err))

const fs = require('fs')
fs.writeFile('./fileerr/write1.txt', '写入成功',err => {
if(!err) {
return console.log('写入成功' + err);
}
return console.log('写入失败' + err.message);
})
在这里面其实是有问题的,因为node是采取的动态拼接地址,也就是如果你的地址是以./或者../开头的相对地址的话,那么到时候执行它是以你执行node的地址拼接上你写入的这个地址,你想想是不是会有bug产生,而且这个时候你就算补全执行也是没得用的。
面对这种情况有两张解决方法,一种是对你要操作的地址采用绝对路径的方式
一种是通过__dirname这个属性可以获得当前文件所在的目录然后再通过我下面讲的内容组合起来就可以完美解决
只不过在这之前先看到一个案例,将一个txt文件横向排列以等号形式建立的一个成绩文本转换成纵向排列以键值对建立的文本怎么来操作
小红=99 小白=100 小黄=70 小黑=66 小绿=88
// 将成绩案例转到file里面的ok.txt 同时将里面的横向排列转为纵向排列
// 1.读取文件
const fs = require('fs')
fs.readFile('./成绩.txt', 'utf-8', (err, dataStr) => {
if(!err) {
// console.log(dataStr);
// 2.处理数据将其转换为数组换成引号再添加换行转义字符
const arrOld = dataStr.split(' ')
const arrNew = []
arrOld.forEach(item => {
arrNew.push(item.replace('=', ':'))
})
// console.log(arrNew);
const str = arrNew.join('\n')
console.log(str);
// 3.写入文件
return fs.writeFile('./file/ok.txt', str, err => {
if (err) {
return console.log('加入文件失败');
}
return console.log('加入文件成功');
})
}
return console.log('查找文件失败');
})

2.
第二个模块path模块
这个模块是拿来处理路径的模块,同样的也要先导入
第一个方法路径拼接
path.join(path)
可以将多个目录拼接起来
const path = require('path')
const pathStr = path.join('/a', '/b/c', '../', '/d', 'e')
console.log(pathStr);
const fs = require('fs')
fs.readFile(path.join(__dirname, 'file/ok.txt'), 'utf-8', (err, dataStr) => {
if (err) {
return console.log('读取失败');
}
return console.log('读取成功\n' + dataStr);
})
path里面还有一个方法是获取路径中的文件名
path.basename(path[,ext])
ext: 扩展名 如果写了扩展名那么找到这个文件名后输出格式将没有扩展名
const path = require('path')
let fileName = path.basename(path.join(__dirname, '/file/ok.txt'))
console.log(fileName);
let fileName1 = path.basename(path.join(__dirname, '/file/ok.txt'), '.txt')
console.log(fileName1);

与这个功能大概类似的还有一个可以获取文件的扩展名
path.extname(path)
3.
接下来看到一个案例,给定一个index.html,里面可以实现数字时钟的效果,其css html js代码都在里面,要做的是把css、js抽离出来通过外联的方式引入进来
// 1.导入所需要的包
const fs = require('fs')
const path = require('path')
// 1.1创建两个正则把style和script标签找出来
const regStyle = /<style>[\d\D]*<\/style>/
const regScript = /<script>[\s\S]*<\/script>/
// 2.fs读取这个文件
fs.readFile(path.join(__dirname, './index.html'), 'utf-8', (err, dataStr) => {
if(err) {
return console.log('读取文件失败');
}
// 2.1读取成功用正则把匹配到的字符串放到对应的文件里面
let styleStr = regStyle.exec(dataStr)
// console.log(styleStr[0]);
styleStr[0] = styleStr[0].replace('<style>','').replace('</style>','')
fs.writeFile(path.join(__dirname,'/clock/index.css'),styleStr[0], err => {
if (err) {
return console.log('写入文件失败' + err.message);
}
return console.log('写入文件成功'); })
// 2.2script标签放入文件
let scriptStr = regScript.exec(dataStr)
// console.log(scriptStr[0]);
scriptStr[0] = scriptStr[0].replace('<script>', '').replace('</script>', '')
fs.writeFile(path.join(__dirname , '/clock/index.js'), scriptStr[0], err => {
if (err) {
return console.log('写入失败' + err.message);
}
return console.log('写入成功');
})
// 2.3修改html代码部分
let newHtml = dataStr.replace(regStyle, '<link rel="stylesheet" href="./clock/index.css">').replace(regScript, '<script src="./clock/index.js"></script>')
fs.writeFile(path.join(__dirname, './index.html'), newHtml, err => {
if (err) {
return console.log('写入html失败');
}
return console.log('写入html成功');
})
})
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>index首页</title>
<style>
html,
body {
margin: 0;
padding: 0;
height: 100%;
background-image: linear-gradient(to bottom right, red, gold);
} .box {
width: 400px;
height: 250px;
background-color: rgba(255, 255, 255, 0.6);
border-radius: 6px;
position: absolute;
left: 50%;
top: 40%;
transform: translate(-50%, -50%);
box-shadow: 1px 1px 10px #fff;
text-shadow: 0px 1px 30px white; display: flex;
justify-content: space-around;
align-items: center;
font-size: 70px;
user-select: none;
padding: 0 20px; /* 盒子投影 */
-webkit-box-reflect: below 0px -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0%, transparent), to(rgba(250, 250, 250, .2)));
}
</style>
</head> <body>
<div class="box">
<div id="HH">00</div>
<div>:</div>
<div id="mm">00</div>
<div>:</div>
<div id="ss">00</div>
</div> <script>
window.onload = function () {
// 定时器,每隔 1 秒执行 1 次
setInterval(() => {
var dt = new Date()
var HH = dt.getHours()
var mm = dt.getMinutes()
var ss = dt.getSeconds() // 为页面上的元素赋值
document.querySelector('#HH').innerHTML = padZero(HH)
document.querySelector('#mm').innerHTML = padZero(mm)
document.querySelector('#ss').innerHTML = padZero(ss)
}, 1000)
} // 补零函数
function padZero(n) {
return n > 9 ? n : '0' + n
}
</script>
</body> </html>

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>index首页</title>
<link rel="stylesheet" href="./clock/index.css">
</head> <body>
<div class="box">
<div id="HH">00</div>
<div>:</div>
<div id="mm">00</div>
<div>:</div>
<div id="ss">00</div>
</div> <script src="./clock/index.js"></script>
</body> </html>
Node.js - fs.path模块的更多相关文章
- Node.js fs文件系统模块
一.读取文件几个步骤 1.先引入fs文件系统模块 2.使用readfile 或 readFileSync 注意点:它们的回调函数有两个参数,第一个是err,第二个是data,得到的data是buffe ...
- node.js的path模块
path模块的各种API path.join([...paths]) 参数:paths <string> ,paths参数是字符串,这些字符串按路径片段顺序排列,(A sequence o ...
- Node.js学习——基本模块之fs
基本模块之fs 异步读文件 异步读取一个文本文件的代码如下: 'use strict'; var fs = require('fs'); fs.readFile('sample.txt', 'utf- ...
- 从官网学习Node.js FS模块方法速查
最新文档请查看仓库 https://github.com/wangduandu... 1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参 ...
- Node.js——fs模块(文件系统),创建、删除目录(文件),读取写入文件流
/* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs.writeFile 写入文件(文件不存在就创建,但不能创 ...
- Node.js FS模块方法速查
1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参数是回调函数.回调函数的第一个参数往往是错误对象,如果没有发生参数,那么第一个参数可能 ...
- Node.js的Formidable模块的使用
今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1) 创建Formidable.IncomingForm对象 var form = new formidab ...
- node.js的File模块
1.Node.js是什么? (1) Nodejs是为了开发高性能的服务器而诞生的一种技术 (2) 简单的说 Node.js 就是运行在服务端的 JavaScript,基于V8进行运行 (3) Node ...
- Node.js入门:模块机制
CommonJS规范 早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来 ...
- node.js中express模块创建服务器和http模块客户端发请求
首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文 ...
随机推荐
- 03.Java 基础语法
1. 注释.标识符.关键字 三种注释 单行注释:// 多行注释:/* 多行注释 */ 文档注释: /** * @Description HelloWorld * @Author xxx */ 标识符 ...
- 比Selenium更优秀的playwright介绍与未来展望
Playwright是微软开发的,专门为满足端到端测试需求而创建的.Playwright支持包括Chromium.WebKit和Firefox在内的所有现代渲染引擎.在Windows.Linux和ma ...
- 在友晶DE10-Lite开发板实现8051单片机
在友晶DE10-Lite开发板实现8051单片机 1. 移植过程 利用FPGA片内资源构建51系统.软核来自https://www.oreganosystems.at/.还需要添加rom.ram和ra ...
- Gitea 代码仓库平台
引言 Gitea 是一个自己托管的 Git 服务程序.他和 GitHub,Bitbucket or Gitlab 等比较类似.它是从 Gogs 发展而来,不过它已经 Fork 并且命名为 Gitea. ...
- kubernetes 二次开发-认证,鉴权(1)
基于webhook的认证 授权过程 认证授权服务需要满足如下kubernetes的规范 kubernetes api-server组件发送 http post 请求 url:https://authn ...
- WPF之单例模式
项目 2019/10/09 问题 2019年10月9日星期三 上午2:46 1.为了实现单例模式,在App类中添加了如下代码,使用了信号量,但是为什么返回;isNew一直为true public ...
- .net core 5,6,7【多线程笔记】取消令牌(CancellationToken) CancellationTokenSource
介绍 在使用C#异步的场景,多多少少会接触到CancellationTokenSource.它和取消异步任务相关的,CancellationToken就是它生产出来的. 演示 任务取消执行回调 var ...
- 一文搞懂C++继承、多继承、菱形继承、虚继承
继承 目录 继承 继承 继承的访问权限 子类赋值给父类 赋值兼容规则 "天然"的行为 验证: 1. 其他权限继承能否支持赋值兼容规则 2.是否"天然",有没有产 ...
- Kubernetes操作图
- vue组件 定义全局组件
组件 (Component) 是 Vue.js 最强大的功能之一,它是html.css.js等的一个聚合体. 组件化 将一个具备完整功能的项目的一部分分割多处使用 加快项目的进度 可以进行项目的复用 ...