Node.js基礎 78:創建和刪除目錄、流和管道

創建和刪除目錄

異步創建刪除目錄

var fs = require('fs');

fs.mkdir('stuff', function() {
    fs.readFile('readMe.txt', 'utf8', function(err, data) {
        fs.writeFile('./stuff/writeMe.txt', data, function() {
            console.log('copy successfully');
        })
    })
});
// fs.unlink("writeMe.txt", function() {
//     console.log("delete writeMe.txt file");
// })刪除文件

遞歸刪除非空文件夾

function delDir(path){
    let files = [];
    if(fs.existsSync(path)){
        files = fs.readdirSync(path);
        files.forEach((file, index) => {
            let curPath = path + "/" + file;
            if(fs.statSync(curPath).isDirectory()){
                delDir(curPath); //遞歸刪除文件夾
            } else {
                fs.unlinkSync(curPath); //刪除文件
            }
        });
        fs.rmdirSync(path);
    }
}
module.exports = delDir;

流和管道

舉例:在命令行中
在這裏插入圖片描述
ls命令:查看當前目錄下的文件和目錄
grep:篩選,例如是否包含"app"這個關鍵字
ls輸出一個(輸出一個信息),這個作爲了grep命令的輸入

文檔:http://nodejs.cn/api/stream.h...
例如:HTTP請求是輸入流,響應是輸出流.
流的應用:

  1. 處理數據,最典型的就是http服務的時候.請求和響應就是流的一種體現,再比如對數據進行的處理,例如webpack,gulp也大量運用了流這個技術,或者對文件進行打包壓縮
  2. 提高讀寫性能,與文件系統的讀寫命令有所區別,文件系統的讀寫文件命令是一次性把文件裏的內容放到內存當中,如果文件很大,用這種命令就不太合適,要用流來處理,流會把內容放到buffer(緩存)中,一邊放一邊處理,這樣的話性能就會很高
//把讀取的文件放入一個流中
var fs = require('fs')
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
//流是一個事件的實例,所以可以放置監聽事件(流可以是可讀的、可寫的、或者可讀可寫的。 所有的流都是 EventEmitter 的實例。)
myReadStream.on('data',function(chunk) {//chunk是塊的意思
    console.log('new chunk received')
    console.log(chunk)
})

readMe.txt文件有5000行的字符,把文件分成一個個buffer,分段處理
在這裏插入圖片描述

在這裏插入圖片描述
在參數里加utf-8,會發現,把那段字符打印出來.

on是在接收數據的時候的監聽函數,end代表在接受數據完成之後的數據

var fs = require('fs')
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
myReadStream.setEncoding('utf8')//編碼也可以這樣寫
var data = ''
myReadStream.on('data',function(chunk) {
    data+=chunk
})
myReadStream.on('end',function () {
    console.log(data)
})

以上就是把一個readMe.txt當做一個流來處理.

如何寫一個流

新建一個寫入流.
寫入的時候直接使用方法write,參數爲數據片段
把readMe.txt裏面的內容寫到writeMe2.txt裏面

var fs = require('fs')
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
var myWriteStream = fs.createWriteStream(__dirname+'/writeMe2.txt')//新建一個寫入流.
myReadStream.setEncoding('utf8')
var data = ''
myReadStream.on('data',function(chunk) {
    myWriteStream.write(chunk)//寫入的時候直接使用方法write,參數爲數據片段
})
myReadStream.on('end',function () {
    // console.log(data)
})

或者:
把'hello world'寫入''writeMe2.txt' 文件

var myWriteStream = fs.createWriteStream(__dirname+'/writeMe2.txt')
var writeData = 'hello world'
myWriteStream.write(writeData)
myWriteStream.end()
myWriteStream.on('finish',function () {
    console.log('finish')
})

使用管道更方便得實現流的操作

實現複製內容的操作

var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
var myWriteStream = fs.createWriteStream(__dirname+'/writeMe2.txt')
myReadStream.pipe(myWriteStream)

把readMe的內容複製到writeMe2
管道運送

流與管道例子

加密,壓縮的過程


// 壓縮
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');

var password = new Buffer(process.env.PASS || 'password');
var encryptStream = crypto.createCipher('aes-256-cbc', password);

var gzip = zlib.createGzip();
var readStream = fs.createReadStream(__dirname + "/readMe.txt"); // current file
var writeStream = fs.createWriteStream(__dirname + '/out.gz');

readStream // reads current file
    .pipe(encryptStream) // encrypts
    .pipe(gzip) // compresses
    .pipe(writeStream) // writes to out file
    .on('finish', function() { // all done
        console.log('done');
    });



// 解壓
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');

var password = new Buffer(process.env.PASS || 'password');
var decryptStream = crypto.createDecipher('aes-256-cbc', password);

var gzip = zlib.createGunzip();
var readStream = fs.createReadStream(__dirname + '/out.gz');

readStream // reads current file
    .pipe(gzip) // uncompresses
    .pipe(decryptStream) // decrypts
    .pipe(process.stdout) // writes to terminal
    .on('finish', function() { // finished
        console.log('done');
    });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章