node - fs - 读取两个文件,以便进行比较

时间:2018-02-06 15:50:50

标签: javascript node.js

如何使用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代理存储库

,我对可以使用的库具有限制性

3 个答案:

答案 0 :(得分:4)

这是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];
});

答案 1 :(得分:1)

您不需要回调功能。您可以使用fs.readFileSync()

编辑但是,fs.readFileSync()正在阻止,只有在函数返回后才会执行下一行。

如果你坚持使用回调:

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

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

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

答案 2 :(得分:0)

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;})