【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
【nodejs学习】1.文件操作的更多相关文章
- NodeJS学习之文件操作
NodeJS -- 文件操作 Buffer(数据块) JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作 ...
- HTML5学习之文件操作(九)
之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很进行跨平台的处理,另外就是让我们的web应用依赖了第三方的插件,而不是很独立 ...
- python学习笔记:文件操作和集合(转)
转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...
- python学习总结---文件操作
# 文件操作 ### 目录管理(os) - 示例 ```python # 执行系统命令 # 清屏 # os.system('cls') # 调出计算器 # os.system('calc') # 查看 ...
- erlang学习笔记(文件操作)
参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)
- Smart210学习记录-------文件操作
一.linux文件操作(只能在linux系统上用) 创建:int creat(const char* filename, mode_t mode) filename 表示要创建的文件名,mode表示对 ...
- python学习day8 文件操作(深度学习)
文件操作 (day7内容扩展) 1 文件基本操作 obj = open('路径',mode='模式',encoding='编码')obj.write()obj.read()obj.close() 2 ...
- python学习日记(文件操作)
文件操作概述 计算机系统分为:操作系统,计算机硬件,应用程序. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序 ...
- nodejs笔记之文件操作
文件操作包含: 读取文件 写入文件 删除文件 创建目录 删除目录 读取文件: // 异步操作 var fs = require("fs"); fs.readFile(". ...
- python 学习分享-文件操作篇
文件操作 f_open=open('*.txt','r')#以只读的方式(r)打开*.txt文件(需要与py文件在同一目录下,如果不同目录,需写全路径) f_open.close()#关闭文件 打开文 ...
随机推荐
- display:inline,display:inline-block,display:block 区别
之前一直迷惑于display:inline/inline-block/block的异同,在度娘谷哥的帮助下,突然有了一点思路. 按照网上的介绍,inline将对象转化为内联元素,block将对象转化为 ...
- rsync指令详解
rsync指令详解(更详细的看官方文档http://rsync.samba.org/ftp/rsync/rsync.html) [root@Centos epel]# rsync --help rsy ...
- em px 简单换算
大部分的网页设计者在CSS代码编写中总是先对整体定义字体尺寸,中文情况下一般为12px,而其实这样以来在通过IE顶部菜单中的“察看-文字大小”设置已无任何 作用.对字体感觉太小的浏览者而言无疑是种很不 ...
- IEnumerable中的 Any方法
IEnumerable类中的 Any方法,表示集合中有任何一元素满足条件,返回就true , 该方法有两个重载 1. 不带任何参数,表示集合中有元素 2. 参入一个 Func<TSource, ...
- 1104解决ecos挂件中数组传递的相关问题。
1.挂件综述: 挂件组成:_config.html 后台配置,即点添加时的弹出框. default.html 前台显示,即在前台显示出来的页面. widget.php 设置挂件的基本信息.. ...
- CentOS下建立本地YUM源并自动更新
1. 尽管有很多的免费镜像提供yum源服务,但是还是有必要建立自己的yum服务器,主要出于以下几点考虑: l 网络速度:访问互联网可能比较慢 l 节省带宽:如果有大量的服务器,架设自己的yum源可以有 ...
- 魔法方法:构造和析构 - 零基础入门学习Python041
魔法方法:构造和析构 让编程改变世界 Change the world by program 构造和析构 什么是魔法方法呢?我们来系统总结下: - 魔法方法总是被双下划线包围,例如__init__ - ...
- shape及其子节点详解
shape最大的最用便是用来替代图片,释放磁盘空间.另外则是增加适应不通过屏幕的设备. 先来看看shape下面的节点以及它所起到的作用. gradient -- 对应颜色渐变(startcolor ...
- Head First --- Python 第一章
List 1. python -V 查看python当前版本 2. list.pop() 删除列表里的最后一个元素,并返回删除元素的值 3. list.extend(['a','b','c']) 在原 ...
- Moving Acerage
http://zh.wikipedia.org/zh/%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87