什么是fs文件系统模块
fs.readFile()方法,用来读取指定文件中的内容
fs.writeFile()方法 ,用来向指定的文件中写入内容
fs模块用require('fs')
fs模块是从何来的?
当我们下载安装了node运行环境,node会将模块存放到我们的计算机中。
读取指定文件内容
fs.readFile()
- 参数1:文件路劲
- 参数2:输入编码例如:utf-8
- 参数3:回调函数,拿到读取失败和成功的结果,err dataStr
//第一步:导入fs模块 我们利用require('fs')导入模块
const fs = require('fs')
//第二步:利用fs模块中的readFile()方法来读取文件
/*
参数1:文件路劲
参数2:输入编码例如:utf-8
参数3:回调函数,拿到读取失败和成功的结果,err dataStr
*/
fs.readFile('./读取文件/1.txt', 'utf8', function (err, dataStr) {
//如果读取成功err就打印null,dataStr的值为文件内容
//如果读取失败err就打印错误对象,dataStr的值为undefined
console.log(err)
console.log('------------')
console.log(dataStr)
})
读取成功
读取失败
- 如果读取成功err就打印null,dataStr的值为文件内容
- 如果读取失败err就打印错误对象,dataStr的值为undefined
判断文件是否读取成功
fs.readFile('./读取文件/1.txt', 'utf-8', function (err, dataStr) {
//当文件读取失败时err返回的是错误对象 if判断为true
//当文件读取成功时err返回的是null if判断为false
if (err) {
return console.log('文件读取成功' + err.message);
} else {
console.log('文件读取成功' + dataStr)
}
})
写入文件内容
- 参数1:写入文件的路径
- 参数2:写入文件的内容
- 参数3:编码格式,默认utf-8(可省略)
- 参数4:回调函数 拿取写入失败的结果err
const fs = require('fs')
/*
参数1:写入文件的路径
参数2:写入文件的内容
参数3:回调函数 拿取写入失败的结果err
*/
fs.writeFile('./写入文件/1.txt', '我很爱你!', function (err) {
//如果文件写入成功err打印出来的结果是null
//如果文件写入失败err打印出来的是一个错误对象
console.log(err)
})
- 如果文件写入成功err打印出来的结果是null
- 如果文件写入失败err打印出来的是一个错误对象
判断文件是否写入成功
const fs = require('fs')
/*
参数1:写入文件的路径
参数2:写入文件的内容
参数3:回调函数 拿取写入失败的结果err
*/
fs.writeFile('./写入文件/1.txt', '我很爱你!', function (err) {
//如果文件写入成功err打印出来的结果是null if判断的值为false
//如果文件写入失败err打印出来的是一个错误对象 if判断的值为true
if (err) {
console.log('文件写入失败:' + err.message);
} else {
console.log('文件写入成功!')
}
})
fs模块小案例
小知识点:/n 表示换行 /r 表示回车 replace()替换字符串
//导入fs模块
const fs = require('fs')
//读取文件信息
fs.readFile('./成绩.txt', 'utf-8', function (err, dataStr) {
//判断是否读取成功
if (err) {
console.log('文件读取失败:' + err.message)
} else {
//将读取的值存入str变量
let str = dataStr
let arr = str.split(' ')
// 处理内容
arr = arr.map(v => {
return v.replace('=', ':')
})
console.log(arr)
str = arr.join('\n')
//写入文件
fs.writeFile('./成绩-ok.txt', str, function (err) {
//判断写入文件是否成功
if (err) {
console.log('文件写入失败:' + err.message)
} else {
console.log('文件写入成功!')
}
})
}
})
路径动态拼接错误问题
使用fs模块操作文件时,如果提供的操作是以./或../开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件的完整路径
解决方法:在代码中使用完整的文件存放路径或__dirname
原因是:我们用相对路径node会在当前路径与你代码的路径进行拼接
使用完整路径解决路径动态拼接问题
缺点:移植性非常差、不利于维护
const fs = require('fs')
//在js中一个\代表转义,我们要用两个\\代表路径
fs.readFile('C:\\Users\\86178\\Desktop\\编程学习\\node编程\\day01了解node的作用\\读取文件\\1.txt', 'utf-8', function (err, dataStr) {
if (err) {
console.log('文件读取失败' + err.message);
} else {
console.log('文件读取成功:' + dataStr);
}
})
注意:要将\换成双\
__dirname解决路径动态拼接问题
__dirname 表示当前文件所处的目录
const fs = require('fs')
//__dirname 表示当前文件所处的目录
console.log(__dirname)
fs.readFile(__dirname + '/读取文件/1.txt', 'utf-8', function (err, dataStr) {
if (err) {
console.log('文件读取失败:' + err.message)
} else {
console.log("文件读取成功:" + dataStr)
}
})
什么是path路径模块
path模块是Node.js官方提供的\用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。
- path.join()方法,用来将多个路径片段拼接成一个完整的路径字符串
- path.basename()方法,用来从字符串中,将文件名解析出来
导入path模块require('path')
const fs = require('fs')
const path = require('path')
//注意: path.join()中 ../ 会抵消前面的路径
const pathStr = path.join('/a', '/b/c', '../', './d', 'e')
console.log(pathStr) // \a\b\d\e
fs.readFile(path.join(__dirname, '/读取文件/1.txt'), 'utf-8', function (err, dataStr) {
if (err) {
console.log('文件读取失败:' + err.message)
} else {
console.log("文件读取成功:" + dataStr)
}
})
注意:今后凡是涉及到路径拼接的操作,都要使用path.join()方法进行处理。不要直接使用+进行字符串的拼接。
获取路径中的文件名
path.basename()
- 参数1:路径字符串
- 参数2:文件扩展名
- 返回:表示路径中的最后一部分
const path = require('path')
//模拟路径
const pathStr = '/a/v/b/d/index.html'
const fullName = path.basename(pathStr)
console.log(fullName);
获取路径的扩展名
path.extname()
- 参数1:表示路径的字符串
- 返回:得到的扩展名字符串
const path = require('path')
const fpath = '/a/v/d/s/index.html'//路径字符串
const fext = path.extname(fpath)
console.log(fext);
时钟案例
const fs = require('fs')
const path = require('path')
// 定义正则表达式,分别匹配<style></style> 和 <script></script> 标签
const regStyle = /<style>[\s\S]*<\/style>/
const regScript = /<script>[\s\S]*<\/script>/
const regHtml = /<html>[\s\S]*<\/html>/
//调用fs模块读取文件
fs.readFile(path.join(__dirname, '../index.html'), 'utf-8', (err, dataStr) => {
if (err) {
return console.log('文件读取失败:' + err.message)
} else {
//封装写入样式
function resolveCSS(dataStr) {
const r1 = regStyle.exec(dataStr)
const newCSS = r1[0].replace('<style>', '').replace('</style>', '')
fs.writeFile(path.join(__dirname, '../css/index.css'), newCSS, (err) => {
if (err) {
console.log('写入失败!' + err.message)
} else {
console.log('样式写入成功!');
}
})
}
//封装写入js
function resolveJs(dataStr) {
const r2 = regScript.exec(dataStr)
const newJs = r2[0].replace('<script>', '').replace('</script>', '')
fs.writeFile(path.join(__dirname, '../js/index.js'), newJs, (err) => {
if (err) {
return console.log('写入js文件失败!' + err.message)
} else {
console.log('写入js文件成功')
}
})
}
//封装写入html文件
function resolveHtml(dataStr) {
const newHtml = dataStr.replace(regStyle.exec(dataStr)[0], `<link rel="stylesheet" href="./css/index.css">`).replace(regScript.exec(dataStr)[0], `<script src="./index.js"></script>`)
fs.writeFile(path.join(__dirname, '../newIndex.html'), newHtml, (err) => {
if (err) {
return console.log('写入html文件失败' + err.message)
} else {
console.log('写入html文件成功!')
}
})
}
resolveCSS(dataStr)
resolveJs(dataStr)
resolveHtml(dataStr)
}
})