模块——require/exports/module

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]这个位置开始。

大文件拷贝

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提供了对二进制数据的操作。
构造Buffer实例:

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> 

Stream(数据流)

如果内存无法一次装下需要处理的数据时,就需要用到数据流,一边读取一边处理。

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();
});

File System(文件系统)

fs模块提供的api基本上可以分为三类:

  • 文件属性读写
    fs.stat、fs.chmod、fs.chown等

  • 文件内容读写
    fs.readFile、fs.readdir、fs.writeFile、fs.mkdir等

  • 底层文件操作
    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(路径)

  • path.normalize(key) //将传入的路径转换成标准路径

  • path.join() //将传入的多个路径拼接为标准路径

  • path.extname //取得文件的扩展名

    path.extname('foo/bar.js');  // => ".js"

bottle_
259 声望22 粉丝

好好学习,好好生活,好好工作