[英]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
而是使用appendFile
( appendFile
會在必要時創建文件)。
您也不必等待附加操作完成,這可能會導致錯誤。 您在這里有各種解決方案:
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.