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"