Node.jsfs模块原理及常见⽤途
JavaScript 的是没有操作⽂件的能⼒,但是 Node 是可以做到的,Node 提供了操作⽂件系统模块,是 Node 中使⽤⾮常重要和⾼频的模块,是绝对要掌握的⼀个模块系统。
fs 模块提供了⾮常多的接⼝,这⾥主要说⼀下⼀些常⽤的接⼝。1.常⽤API快速复习fs.stat 检测是⽂件还是⽬录
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 创建⽬录
const fs = require('fs')fs.mkdir('logs', error => { if(error) {
console.log(error) } else {
console.log('⽬录创建成功!') }})
fs.rmdir 删除⽬录
const fs = require('fs')fs.rmdir('logs', error => { if(error) {
console.log(error) } else {
console.log('成功删除了⽬录 logs') }})
fs.writeFile 创建写⼊⽂件
const fs = require('fs')
fs.writeFile('logs/hello.log','您好~\\n', error => { if(error) {
console.log(error) } else {
console.log('成功写⼊⽂件'); }})
fs.appendFile 追加⽂件
const fs = require('fs')
fs.appendFile('logs/hello.log','hello~\\n', error => { if(error) {
console.log(error) } else {
console.log('成功写⼊⽂件'); }})
fs.readFile 读取⽂件
const fs = require('fs')
fs.readFile('logs/hello.log','utf-8', (error, data) => { if(error) {
console.log(error) } else {
console.log(data); }})
fs.unlink 删除⽂件
const fs = require('fs')
fs.unlink(`logs/${file}`, error => { if(error) {
console.log(error) } else {
console.log(`成功删除了⽂件: ${file}`) }})
fs.readdir 读取⽬录
const fs = require('fs')
fs.readdir('logs', (error, files) => { if(error) {
console.log(error) } else {
console.log(files); }})
fs.rename 重命名,还可以更改⽂件的存放路径
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 命令midir -p tmp/foo/bar/baz
上述命令也可以在当前⽬录创建多层⼏⽂件夹。如下代码在当前⽬录⽣成多层级⽂件夹
const mkdirp = require('mkdirp')
mkdirp('tmp/foo/bar/baz').then(made => console.log(`创建⽬录于: ${made}`))// 创建⽬录于: /Users/zhangbing/github/CodeTest/Node/fs/tmp3.实战举例实战1
判断服务器上⾯有没有 upload ⽬录。如果没有就创建这个⽬录,如果有的话不做操作
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 ⽬录下⾯的所有的⽬录,然后放在⼀个数组中使⽤同步⽅法⽅式
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 ⽅式
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.管道流
管道提供了⼀个输出流到输⼊流的机制。通常我们⽤于从⼀个流中获取数据并将数据传递到另外⼀个流中。以下实例我们通过
读取⼀个⽂件内容并将内容写⼊到另外⼀个⽂件中。
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 从⽂件流中读取数据
const fs = require('fs')
const fileReadStream = fs.fileReadStream('demo1.js')let count = 0let 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 写⼊⽂件
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 中代码如下
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 下会报如下错误:Error: EISDIR: illegal operation on a directory, open 以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。