为什么以下fs.writeFile只写入上一个文件中的数据?

时间:2015-05-18 12:34:01

标签: javascript node.js

我想阅读两个文件(相同文件夹)的内容并将它们写入一个文件:

  const input = process.argv[2]

  fs.readdir(__dirname + `/${input}/`, (err, files) => {
    if (err) {
      return
    }

    files.forEach((file) => {
      fs.readFile(__dirname + `/${input}/` + file, 'utf8', (err, data) => {
        let items = []
        items.unshift(data)
        let result = items.join('\n\n')

        fs.writeFile("untitled2.html", result, (err) => {
          if (err) {
            console.log(err)
          } else {
            console.log(result)
          }
        })
      })
    })
  })

console.log(result)输出两个文件的内容:

alex@alex-K43U:~/node/m2n/bin$ node index4.js folder

File 1

File 2

但是,该文件只包含第二个文件中的内容:

File 2

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

当您的目标是在不替换内容的情况下附加到文件时,请不要使用writeFile,而是使用appendFileappendFile负责在必要时创建文件。

您也没有等待附加完成,这可能会导致错误。你有各种解决方案:

  • 一个接一个地递归函数处理文件
  • 使用appendFileSync(假设您正在编写实用程序而不是服务器)

使用递归函数:

(function doOneFile(){
    var file = files.shift();
    if (!file) return;
    fs.readFile(__dirname + `/${input}/` + file, 'utf8', (err, data) => {
        let items = []
        items.unshift(data)
        let result = items.join('\n\n')

        fs.appendFile("untitled2.html", result, (err) => {
          if (err) {
            console.log(err)
          } else {
            console.log(result)
          }
          doOneFile();
        })
    })
})();

答案 1 :(得分:1)

使用默认选项,writeFile每次都会删除以前的内容。这是“写模式”。你想要的是切换到“附加模式”,如下所示:

fs.writeFile("untitled2.html", result, {flag:"a"}, callbacks...);

在此过程中,您需要注意在循环之前擦除可能的文件内容,或者让第一次访问处于写入模式。否则,您将继续追加预先存在的内容。

此外,在这种情况下,您将遇到并发访问的问题。使用同步表单,或通过回调循环文件。