我想阅读两个文件(相同文件夹)的内容并将它们写入一个文件:
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
这里发生了什么?
答案 0 :(得分:3)
当您的目标是在不替换内容的情况下附加到文件时,请不要使用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();
})
})
})();
答案 1 :(得分:1)
使用默认选项,writeFile
每次都会删除以前的内容。这是“写模式”。你想要的是切换到“附加模式”,如下所示:
fs.writeFile("untitled2.html", result, {flag:"a"}, callbacks...);
在此过程中,您需要注意在循环之前擦除可能的文件内容,或者让第一次访问处于写入模式。否则,您将继续追加预先存在的内容。
此外,在这种情况下,您将遇到并发访问的问题。使用同步表单,或通过回调循环文件。