刚开始学习node
//对整数补零,凑位
var fs = require("fs");
function PrefixInteger(num, n) {
return (Array(n).join(0) + num).slice(-n);
}
//将数值写入文件
for(var i=010000;i<=319999;i++)
{
var num = PrefixInteger(i,6);
console.log(num);
fs.appendFile('num.txt',num+'\n',function(err){
if(err)
console.log(err);
console.log( num+ "success!");
});
}
问题一:
输出的都是 319999 success! 是因为回调函数的原因嘛?
问题二:
num.txt文件里只有 004096 到 008179 ?为什么?不应该是从010000开始吗?
问题三:
Error: EMFILE: too many open files, open ‘num.txt’
我这样写,哪里不对,为什么会报错?
1, for 先于任一回调被执行前就已经循环完成,所以回调输出时全部得到的是 num 的最后值。 2, 010000 字面量指示这个是八进制的一万,转成十进制中就是4096,0x10000代表是这十六进制的一万。你要按十进制的一万请把前面的0去掉。 3, 因为 for 是先执行完,你这个代码相当在一瞬间打开 319999 - 4096 个文件。由于操作系统的文件描述符都是有限的,所以会出错。
问题一: for循环在回调被调用之前完成,num循环结束等于319999,回调输出自然就是319999。
问题二: 010000是八进制数,十进制就是4096。
问题三: 每个进程可开启的文件句柄数是有限制的,不同的操作系统默认值不同,你开启数量已经到达上限了。你可以去看fs.appendFile的源代码,你每次调用它,都会开启文件,在回调没有执行前,文件不会被关闭。for循环调用fs.appendFile只负责开启文件,但异步没有执行完毕,并不会关闭,所以文件句柄就超过系统上限了。
@klesh 谢谢,你的答复,我明白了
stream
@fundon 脑抽了,看到这个回复才想起来0.0fs.createWriteStream
就是这个: fs.createWriteStream