CNode

readline读取文件多次执行时异常

问答
Kkuyu132发布于6 年前最后回复6 年前7 回复4463 浏览0 收藏
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)

W
waitingsong#1·6 年前

先格式化下代码吧。

K
kuyu132#2·6 年前
引用 waitingsong先格式化下代码吧。

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

H
HobaiRiku#3·6 年前

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

W
waitingsong#5·6 年前

这样试试?

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关闭了");
    });
  });
}
H
HobaiRiku#6·6 年前
引用 kuyu132@HobaiRiku 大佬,快速的多执行几次?

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

K
kuyu132#7·6 年前
引用 HobaiRiku@kuyu132 我文件有1000行,每次并发10个你的函数,然后延迟100毫秒继续运行,没见出错或者卡住。

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

参与回复
登录后即可参与回复。登录