readline读取文件多次执行时异常
发布于 4 年前 作者 kuyu132 3996 次浏览 来自 问答
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出来哈,先忽略,谢谢了!

回到顶部