Nodejs 是否可以用 node 的 stream 来读并改写最后写入到同一个文件?
Nodejs 是否可以用 node 的 stream 来读并改写最后写入到同一个文件?
我现在的做法是多创建一个临时文件,然后删除原文件,重命名临时文件,我想知道有没有更好的办法来实现用 node 流来改写同文件?
代码如下
const rm = require('rimraf')
const through2 = require('through2')
const fs = require('graceful-fs')
// source file path
const replacementPath = `./static/projects/${destPath}/index.html`
// temp file path
const tempfilePath = `./static/projects/${destPath}/tempfile.html`
// read source file then write into temp file
await promiseReplace(replacementPath, tempfilePath)
// del the source file
rm.sync(replacementPath)
// rename the temp file name to source file name
fs.renameSync(tempfilePath, replacementPath)
// del the temp file
rm.sync(tempfilePath)
// promiseify readStream and writeStream
function promiseReplace (readfile, writefile) {
return new Promise((res, rej) => {
fs.createReadStream(readfile)
.pipe(through2.obj(function (chunk, encoding, done) {
const replaced = chunk.toString().replace(/id=“wrap”/g, ‘dududud’)
done(null, replaced)
}))
.pipe(fs.createWriteStream(writefile))
.on(‘finish’, () => {
console.log(‘replace done’)
res()
})
.on(‘error’, (err) => {
console.log(err)
rej(err)
})
})
}
应该是不行的 要么全读进内存 要么创建临时文件
当然可以,Node.js 的 stream
模块非常强大,可以很方便地实现读取、处理和写入同一个文件的操作。下面是一个简单的示例,展示了如何使用 Node.js 的 fs
模块和 stream
模块来读取一个文件的内容,进行一些修改,然后将修改后的内容写回到同一个文件。
const fs = require('fs');
const { Transform } = require('stream');
// 创建一个 Transform 流来修改数据
class ModifyStream extends Transform {
_transform(chunk, encoding, callback) {
// 这里可以添加你的修改逻辑,例如将文本转换为大写
const modifiedChunk = chunk.toString().toUpperCase();
this.push(modifiedChunk);
callback();
}
}
const inputFile = 'example.txt';
const outputFile = 'example_modified.txt'; // 可以是同一个文件路径
const readStream = fs.createReadStream(inputFile);
const modifyStream = new ModifyStream();
const writeStream = fs.createWriteStream(outputFile);
// 管道流操作
readStream
.pipe(modifyStream)
.pipe(writeStream)
.on('finish', () => {
console.log('File has been modified and written back.');
// 如果需要写回到同一个文件,可以在这里删除临时文件并重命名
fs.rename(outputFile, inputFile, (err) => {
if (err) throw err;
console.log('File has been updated in place.');
});
});
注意,上面的代码示例中,先将修改后的内容写入一个临时文件 example_modified.txt
,然后再重命名回原文件 example.txt
。这是为了避免在读写过程中损坏原文件。在实际应用中,可以根据需要调整文件名和处理逻辑。