簡體   English   中英

為什么以下fs.writeFile僅寫入最后一個文件中的數據?

[英]Why is the following fs.writeFile only writing data from the last file?

我想讀取兩個文件(相同文件夾)的內容,並將它們寫入一個文件:

  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

這里發生了什么事?

當您的目標是在不替換內容的情況下追加到文件時,請不要使用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();
        })
    })
})();

使用默認選項, writeFile每次都會擦除先前的內容。 這是“寫入模式”。 您想要的是切換到“附加模式”,如下所示:

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

在此過程中,您需要注意在循環之前擦除可能的文件內容,或者使首次訪問處於寫入模式。 否則,您將繼續添加以前存在的內容。

此外,在這種情況下,您將遇到並發訪問問題。 要么使用同步表單,要么通過回調循環遍歷文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM