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 目錄下面的全部的目錄,而後放在一個數組中數組
使用同步方法方式bash
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' ]
複製代碼
管道提供了一個輸出流到輸入流的機制。一般咱們用於從一個流中獲取數據並將數據傳遞到另一個流中。如下實例咱們經過讀取一個文件內容並將內容寫入到另一個文件中。
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>
複製代碼