var fs = require('fs'); var http = require('http'); //引用模塊 module.exports = function(){} // 輸出模塊
var fs = require('fs'); function copy(src, dst) { fs.writeFileSync(dst, fs.readFileSync(src)); } function main(argv) { copy(argv[0], argv[1]); } main(process.argv.slice(2));
process是一個全局變量,可經過process.argv得到命令行參數。因爲argv[0]固定等於nodejs執行程序的絕對路徑,argv[1]固定等於主模塊的絕對路徑,所以第一個命令行參數從argv[2]這個位置開始。node
var fs = require('fs'); function copy(src, dst) { fs.createReadStream(src).pipe(fs.createWriteStream(dst)); } function main(argv) { copy(argv[0], argv[1]); } main(process.argv.slice[2]);
Buffer提供了對二進制數據的操做。
構造Buffer實例:api
var bin = new Buffer([0x68, 0x6c, 0x6c, 0x6f]);
Buffer與字符串互相轉化:數組
var str = bin.toString('utf-8'); // => "hello" 將字符串轉換爲指定編碼下的二進制數據: var bin = new Buffer('hello', 'utf-8'); // => <Buffer 68 65 6c 6c 6f>
Buffer與字符串的區別:
字符串是隻讀的,而且對字符串的任何修改獲得的都是一個新的字符串,原字符串保持不變,至於Buffer,更像是能夠作指針操做的c語言數組,改變的是指針的指向,若是修改的話,原Buffer也會被改動。緩存
var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]); var sub = bin.slice(2); sub[0] = 0x65; console.log(bin); // => <Buffer 68 65 6c 6f>
若是想拷貝一份Buffer,得首先建立一個新的Buffer,並經過.copy方法把原Buffer中的數據複製過去。異步
var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]); var dup = new Buffer(bin.length); bin.copy(dup); dup[0] = 0x48; console.log(bin); // => <Buffer 68 65 6c 6c 6f> console.log(dup); // => <Buffer 48 65 6c 6c 6f>
若是內存沒法一次裝下須要處理的數據時,就須要用到數據流,一邊讀取一邊處理。ui
var rs = fs.createReadStream(pathname); rs.on('data', function(chunk) { rs.pause(); //在處理數據前暫停數據讀取,並在處理數據後繼續讀取數據 dosomething(chunk); }); rs.on('end', function() { cleanUp(); });
爲數據目標建立一個只寫數據流,示例以下:編碼
var rs = fs.createReadStream(pathname); var ws = fs.createWriteStream(dst); rs.on('data', function(chunk) { if(ws.write(chunk) === false) { //寫入速度跟不上讀取速度時,只寫數據流內部的緩存會爆倉,根據返回值判斷傳入的數據時寫入目標了仍是臨時放在緩存了 rs.pause(); //若是是放入緩存,就暫停數據數據讀取 } }); rs.on('end', function() { ws.end(); }); ws.on('drain', function() { rs.resume(); });
fs模塊提供的api基本上能夠分爲三類:命令行
文件屬性讀寫
fs.stat、fs.chmod、fs.chown等指針
文件內容讀寫
fs.readFile、fs.readdir、fs.writeFile、fs.mkdir等code
底層文件操做
fs.open、fs.read、fs.write、fs.close等
基本全部的fs模塊api的回調參數都是兩個
fs.readFile(pathname, function(err, data) {
if(err) { //deal with error. }else { //deal with data. }
}); //異步IO模型
try {
var data = fs.readFileSync(pathname); //deal with data.
} catch (err) {
//deal with error.
}; //同步模型
path.normalize(key) //將傳入的路徑轉換成標準路徑
path.join() //將傳入的多個路徑拼接爲標準路徑
path.extname //取得文件的擴展名
path.extname('foo/bar.js'); // => ".js"