JavaScript 的是没有操做文件的能力,可是 Node 是能够作到的,Node 提供了操做文件系统模块,是 Node 中使用很是重要和高频的模块,是绝对要掌握的一个模块系统。css
fs
模块提供了很是多的接口,这里主要说一下一些经常使用的接口。html
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('重命名成功') } })
mkdirp 不只能够建立文件夹,还能够建立多层的文件夹,相似 mkdir -p
命令git
midir -p tmp/foo/bar/baz
上述命令也能够在当前目录建立多层几文件夹。github
以下代码在当前目录生成多层级文件夹shell
const mkdirp = require('mkdirp') mkdirp('tmp/foo/bar/baz').then(made => console.log(`建立目录于: ${made}`)) // 建立目录于: /Users/zhangbing/github/CodeTest/Node/fs/tmp
结果数据库
判断服务器上面有没有 upload 目录。若是没有就建立这个目录,若是有的话不作操做npm
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 } }) }
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 方式app
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' ]
管道提供了一个输出流到输入流的机制。一般咱们用于从一个流中获取数据并将数据传递到另一个流中。如下实例咱们经过读取一个文件内容并将内容写入到另一个文件中。
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 = 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
写入文件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 <directory>