Nodejs 是否可以用 node 的 stream 来读并改写最后写入到同一个文件?

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

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) }) }) }


2 回复

应该是不行的 要么全读进内存 要么创建临时文件


当然可以,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。这是为了避免在读写过程中损坏原文件。在实际应用中,可以根据需要调整文件名和处理逻辑。

回到顶部