zoukankan      html  css  js  c++  java
  • 【nodejs学习】1.文件操作

    1.小文件拷贝,使用nodejs内置模块

    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是一个全局变量,可通过procress.argv获得命令行参数,argv[0]固定等于nodejs执行程序绝对路径,argv[1]主模块绝对路径,argv[2]命令行参数.

    对于大文件,内存有限制,则应该修改为:

    fs.createReadStream(src).pipe(fs.createWriteStream(dst));

    两个数据流,pipe把两个流连接起来了

    2.API

    1)Buffer:与String对等的全局构造函数Buffer来提供对二进制数据的操作。可以直接构造

    var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);

    可以使用.length获取字节长度,可以使用[index]方式读取指定的字节:bin[0]

    转化为字符串:

    var str = bin.toString('utf-8');//hello

    var bin = new Buffer('hello','utf-8');//<Buffer 68 65 6c 6c 6f>

    字符串是只读的,Buffer是可以更改的,像数组一样。

    .slice不是返回一个新的Buffer,而是返回指向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 65 6c 6f>

    2)Stream数据流

    var rs = fs.createReadStream(src);

    rs.on('data', function(chunk){

        rs.pause();

        doSomeThing(chunk, function(){

            rs.resume();

        });

    });

    rs.on('end', function(){

        cleanUp();

    });

    var rs = fs.createReadStream(src);

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

    });

    注:这种场景应用很多,因此,提供了.pipe方法来做,其中内部实现与上述方法类似。

    3)文件系统

    文件属性读写:fs.stat,fs.chmod,fs.chown

    文件内容读写:fs.readFile,fs.readdir,fs.writeFile,fs.mkdir

    底层文件操作:fs.open,fs.read,fs.write,fs.close

    nodejs最精华的异步IO在fs中有体现:

    fs.readFile(pathname, function(err, data){

        if(err){

            //deal with err

        }else{

            //deal with data

        }

    });

    在fs模块的所有异步操作都有同步版本的API,后面都加了一个Sync,异常对象与执行结果的传递方式也有相应变化。例:

    try{

        var data = fs.readFileSync(pathname);

        //deal with data

    }catch(err){

        //data with error

    }

    4)Path

    path.normalize:将传入个路径转换成标准路径,去掉.与..,去掉多余,例如:

    var cache = {};

    function store(key, value){

        cache[path.normalize(key)] = value;

    }

    store('foo/bar', 1);

    store('foo//baz//../bar', 2);

    console.log(cache);//=>{"foo/bar":2}

    path.join:将传入的多个路径拼接为标准路径

    path.join('foo/','baz/','../bar');//=>"foo/bar"

    path.extanme:获取文件名扩展名

    5)遍历目录

    function travel(dir, callback){

        fs.readdirSync(dir).forEach(function(file){

            var pathname = path.join(dir, file);

            if(fs.statSync(pathname).isDirectory()){

                travel(pathname, callback);

            }else{

                callback(pathname);

            }

        });

    }

    //遍历目录异步版本,这一个我还需要好好理解,请指教

    function travel(dir, callback, finish){

        fs.readdir(dir, function(err, files){

            (function next(i){

                if(i<files.length){

                    var pathname = path.join(dir, files[i]);

                    fs.stat(pathname, function(err, stats){

                        if(stats.isDirectory()){

                            travel(pathname, callback, function(){

                                next(i+1);

                            });

                        }else{

                            callback(pathname, function(){

                                next(i+1);

                            });

                        };

                    });

                }else{

                    finish && finish();

                }

            }(0));

        })

    }

    3.文本编码

    FE FF       :UTF16BE

    FF FE       :UTF16LE

    EF BB BF  :UTF8

    识别和去除UTF8 BOM的功能

    function readText(pathname){

        var bin = fs.readFileSync(pathname);

        if(bin[0] === 0xEE && bin[1] === 0xBB && bin[2] === 0xBF){

            bin = bin.slice(3);

        }

        return bin.toString('utf-8');

    }

    GBK转UTF8

    var iconv = require('iconv-lite');

    function readGBKText(pathname){

        var bin = fs.readFileSync(pathname);

        return iconv.decode(bin, 'gbk');

    }

    单字节编码

    function replace(pathname){

        var str = fs.readFileSync(pathname, 'binary');

        str = str.replace('foo', 'bar');

        fs.writeFileSync(pathname, str, 'binary');

    }

    附录:

    UTF8 BOM: Byte Order Mark,字节序标记,EF BB BF

  • 相关阅读:
    unbuntu系统下在文件中按上下左右出现错误码
    构建之法阅读笔记
    cloudera卸载
    第二阶段团队站立会议04
    第二阶段团队站立会议03
    第二阶段团队站立会议02
    第二阶段团队站立会议01
    团队测试
    cnblogs.com的用户体验
    对于每个小组的意见
  • 原文地址:https://www.cnblogs.com/renyuzhuo/p/5054470.html
Copyright © 2011-2022 走看看