新手,请教几个问题,fs模块,写入文件
发布于 9 年前 作者 Youthink 4759 次浏览 最后一次编辑是 8 年前 来自 问答

刚开始学习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’

我这样写,哪里不对,为什么会报错?

7 回复

1, for 先于任一回调被执行前就已经循环完成,所以回调输出时全部得到的是 num 的最后值。 2, 010000 字面量指示这个是八进制的一万,转成十进制中就是4096,0x10000代表是这十六进制的一万。你要按十进制的一万请把前面的0去掉。 3, 因为 for 是先执行完,你这个代码相当在一瞬间打开 319999 - 4096 个文件。由于操作系统的文件描述符都是有限的,所以会出错。

问题一: for循环在回调被调用之前完成,num循环结束等于319999,回调输出自然就是319999。

问题二: 010000是八进制数,十进制就是4096。

问题三: 每个进程可开启的文件句柄数是有限制的,不同的操作系统默认值不同,你开启数量已经到达上限了。你可以去看fs.appendFile的源代码,你每次调用它,都会开启文件,在回调没有执行前,文件不会被关闭。for循环调用fs.appendFile只负责开启文件,但异步没有执行完毕,并不会关闭,所以文件句柄就超过系统上限了。

@klesh 谢谢,你的答复,我明白了

@coordcn 是不是异步的写法,就不应该用for循环了,异步应该怎么实现循环写入文件,我看社区里这篇文章用了缓冲区,一定要用这个吗?

@fundon 脑抽了,看到这个回复才想起来0.0fs.createWriteStream

就是这个: fs.createWriteStream

回到顶部