readline读取文件多次执行时异常 - CNode技术社区

readline读取文件多次执行时异常
发布于 6 年前 作者 kuyu132 4331 次浏览 来自 问答
export function readFile(path){
 return new Promise(function (resolve, reject) {
 let input = fs.createReadStream(path);
 const readline = require('readline');
 const rl = readline.createInterface({
 input: input,
 crlfDelay: Infinity
 });
 let tmpfd;
 console.log("准备读取文件了");
 input.on('open',(fd)=>{
 console.log("打开文件");
 console.log(fd);
 tmpfd = fd;
 });
 input.on('error',()=>{
 console.log("error");
 reject();
 });
 input.on('close',()=>{
 console.log("读取完毕!input");
 if(tmpfd){
 fs.close(tmpfd,function () {
 console.log("fs close");
 });
 }
 resolve();
 });
 rl.on("line", (line) => {
 console.log(line);
 });
 rl.on('close',function () {
 console.log("readline关闭了");
 });
 });
}

代码如上,第一次调用的时候可以正常的读取完毕,但执行第二次的时候可能就会只打印:准备读取文件了

不知道为啥?求大佬们解惑,谢谢了

7 回复

先格式化下代码吧。

@waitingsong 不好意思哈,写上去看着是好的,保存后缩进符就没了,已经修正了

临近下班来摸鱼,复制了你的代码在node下运行,不管是并行还是穿行还是延时调用第二次,读取同一个文件,都是没问题的。你说在electron下异常,而且还是概率性的,而且打包后竟然概率还会低。这种玄学问题建议还是提供最小复现仓库大家来分析分析。

@HobaiRiku 大佬,快速的多执行几次?

这样试试?

export function readFile(path){
 return new Promise(function (resolve, reject) {
 const input = fs.createReadStream(path, { autoClose: true, emitClose: true });
 const readline = require('readline');
 const rl = readline.createInterface({
 input: input,
 crlfDelay: Infinity
 });
	
 console.log("准备读取文件了");
 input.on('open',(fd)=>{
 console.log("打开文件");
 });
 input.on('error',()=>{
 console.log("error");
 reject();
 });
 input.on('close',()=>{
 console.log("读取完毕!input");
 resolve();
 });
	
 rl.on("line", (line) => {
 console.log(line);
 });
 rl.on('close',function () {
 console.log("readline关闭了");
 });
 });
}

@kuyu132 我文件有1000行,每次并发10个你的函数,然后延迟100毫秒继续运行,没见出错或者卡住。

@HobaiRiku 辛苦大佬,我这边文件很小的时候就复现了,不过是在electron上面,等我有时间弄个demo出来哈,先忽略,谢谢了!

回到顶部

AltStyle によって変換されたページ (->オリジナル) /