readline读取文件多次执行时异常
发布于 1 天前 作者 kuyu132 348 次浏览 最后一次编辑是 18 小时前 来自 问答
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关闭了");
    });
  });
}

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

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

5 回复

先格式化下代码吧。

@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关闭了");
    });
  });
}
回到顶部