【问题标题】:node - fs - reading two files so they can be comparednode - fs - 读取两个文件以便比较
【发布时间】:2018-02-07 00:02:25
【问题描述】:

如何使用 fs 读取两个文件并以某种方式获得两个结果,以便我可以比较它们。我查看了this,但它略有不同,我找不到做我需要的方法。

我可以从回调中调用diffChars,但是如何处理两个回调函数呢?

  fs.readFile('/abc1.txt',  function (err, data1) {
    console.log(data1);
});
  fs.readFile('/abc1.txt',  function (err, data2) {
    console.log(data2);
});

 later I want to do like this

 var fileDiff = require("diff");
 var difference = fileDiff.diffChars(data1,data2);
 cnsole.log(difference);

注意:由于 npm 代理存储库,我对可以使用的库有所限制

【问题讨论】:

  • 尝试fs.readFileSync,“fs.readFile() 的同步版本。返回路径的内容。”
  • 如果可以的话:github.com/jprichardson/node-fs-extra 提供了 readFile 的一个版本,它返回一个承诺而不是使用回调。否则看util.promisify

标签: javascript node.js


【解决方案1】:

这是PromisePromise.all 的完美案例。

function readFile(name) {
    return new Promise((resolve, reject) =>
        fs.readFile(name,  function (err, data) {
            if (err) { reject(err); }
            resolve(data);
        });
    });
}

Promise.all(readFile('file1'), readFile('file2')).then(data => {
   var file1 = data[0];
   var file2 = data[1];
});

【讨论】:

  • 当我像上面那样加上这个代码 var fileDiff = require('diff'); var difference = fileDiff.diffSentences(file1, file2);diffChars 时,我得到 'TypeError: value.split is not a function'
  • 那么为什么console.log(typeof file1)console.log(typeof file2) 返回string
  • 在我将 .toString() 添加到 file1file2 后它起作用了。谢谢!
【解决方案2】:

您不需要回调函数。你可以使用fs.readFileSync()

EDIT 但是,fs.readFileSync() 处于阻塞状态,只有在函数返回时才会执行下一行。

如果你坚持使用回调:

fs.readFile("abc123.txt", (error1, data1) => {
  if (error1) {
    return;
  }

  fs.readFile("abc456.txt", (error2, data2) => {
    if (error2) {
      return;
    }

    console.log(data1 === data2);
  });
});

【讨论】:

  • readFileSync 正在阻塞并将阻塞节点事件循环。换句话说,这样做会停止一切运行,直到文件被读取。
  • @JimWright 可能没问题,具体取决于使用的上下文。我知道它肯定不像异步读取那样普遍,但肯定存在有效的上下文。
  • @JimWright,编辑了我的答案,谢谢。提到它确实有意义。
  • @Moritz Schmitz v. Hülst 与我上面对 Daniel A. White 回答的评论相同
【解决方案3】:

Node 使用异步编码风格。 因此,当您正在读取文件一个时,第二个文件也正在被读取,并且下一个代码正在被执行。 因此,您可以使用承诺或回调。 这是一种解决方案

fs.readFile('/abc1.txt',  function (err, data1) {
    console.log(data1);
    fs.readFile('/abc1.txt',  function (err, data2) {
        console.log(data2);
        var fileDiff = require("diff");
        var difference = fileDiff.diffChars(data1,data2);
        console.log(difference);
    });      
});

或使用类似的承诺

var data;
fs.readFile('/abc1.txt')
.then((data1)=>{
    data = data1;
    return(fs.readFile('/abc1.txt'))
})
.then((data2)=>{
    var difference = fileDiff.diffChars(data1,data2);
    return(difference)
})
/* do what ever you want here*/
.catch((err)=>{throw err;})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多