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

【nodejs学习】1.文件操作的更多相关文章

  1. NodeJS学习之文件操作

    NodeJS -- 文件操作 Buffer(数据块) JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作 ...

  2. HTML5学习之文件操作(九)

    之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很进行跨平台的处理,另外就是让我们的web应用依赖了第三方的插件,而不是很独立 ...

  3. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  4. python学习总结---文件操作

    # 文件操作 ### 目录管理(os) - 示例 ```python # 执行系统命令 # 清屏 # os.system('cls') # 调出计算器 # os.system('calc') # 查看 ...

  5. erlang学习笔记(文件操作)

    参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)

  6. Smart210学习记录-------文件操作

    一.linux文件操作(只能在linux系统上用) 创建:int creat(const char* filename, mode_t mode) filename 表示要创建的文件名,mode表示对 ...

  7. python学习day8 文件操作(深度学习)

    文件操作 (day7内容扩展) 1 文件基本操作 obj = open('路径',mode='模式',encoding='编码')obj.write()obj.read()obj.close() 2 ...

  8. python学习日记(文件操作)

    文件操作概述 计算机系统分为:操作系统,计算机硬件,应用程序. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序 ...

  9. nodejs笔记之文件操作

    文件操作包含: 读取文件 写入文件 删除文件 创建目录 删除目录 读取文件: // 异步操作 var fs = require("fs"); fs.readFile(". ...

  10. python 学习分享-文件操作篇

    文件操作 f_open=open('*.txt','r')#以只读的方式(r)打开*.txt文件(需要与py文件在同一目录下,如果不同目录,需写全路径) f_open.close()#关闭文件 打开文 ...

随机推荐

  1. DSP TMS320C6000基础学习(6)—— gel文件

    什么是gel文件?gel文件能干什么? gel全称General Extended Language,即通用扩展语言文件,gel文件中由类似C语言的代码构成,gel语言是一种解释性语言,gel文件扩展 ...

  2. Android Fragment用法之给Activity创建事件回调

    在某些案例中,可能需要Fragment与Activity共享事件.在Fragment内部定义一个回调接口是一个好方法,并且规定由持有它的Activity实现这个回调方法.当Activity通过接口接受 ...

  3. cmd命名设置成全局

    如在jsdoc里.想要把jsdoc命名设置成全局.只要把环境变量里面的用户变量里面的path变量值增加 C:\Program Files\nodejs;E:\Program Files (x86)\j ...

  4. trident教程

      (一)理论基础更多理论以后再补充,或者参考书籍1.trident是什么?Trident is a high-level abstraction for doing realtime computi ...

  5. Python3 如何优雅地使用正则表达式(详解五)

    非捕获组命名组 精心设计的正则表达式可能会划分很多组,这些组不仅可以匹配相关的子串,还能够对正则表达式本身进行分组和结构化.在复杂的正则表达式中,由于有太多的组,因此通过组的序号来跟踪和使用会变得困难 ...

  6. CCAN:C语言的模块仓库

    实践中一门编程语言是否有用.好不好,不仅体现在语言本身,更在语言的生态系统:用的人多不多.社区是否活跃互帮互助.语言的相关库和框架质量如何,还有就是已有的模块的质量与数量. CPAN(Comprehe ...

  7. Javascript Promise 学习(上)

    Promise 就是处理异步的一个规范方法 a();b();alert("a");如果a() 里面有一个ajax 或者settimeout 那么alert("a" ...

  8. 在QT程序中使用cout和cin

    1先输入10个数字,再输出. #include <QtCore/QCoreApplication> #include <QtCore/QList> #include <Q ...

  9. Oracle 客户端 NLS_LANG 的设置(转)

    1. NLS_LANG 参数组成NLS_LANG参数由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characters ...

  10. 2014-08-13 SQL语句之Left Join

    今天是在吾索实习的第26天.这天在处理数据库数据的时候发现了一个不错的语句就是Left Join,即左连接.  其功能是:即使右表中没有匹配,也从左表返回所有的行.也就是说,显示的行数与左表一致,且当 ...