1

ノード ファイル ストリームとカスタム変換関数を使用していくつかのファイルを変更しようとしています。これは変換関数です:

const TransformStream = function() {
  Transform.call(this, {objectMode: true});
};
util.inherits(TransformStream, Transform);

TransformStream.prototype._transform = function(chunk, encoding, callback) {
  let line = chunk.toString()
  if (!this.findLinesMode && lineStartRe.test(line)) {
    this.findLinesMode = true
    this.lines = []
  }
  if (this.findLinesMode) {
    this.lines.push(line)
  }
  if (this.findLinesMode && lineEndRe.test(line)) {
    this.findLinesMode = false
    line = this.lines.join('').replace(re, (str, match) => match.trim())
  }
  if (!this.findLinesMode) {
    this.push(line + '\n')
  }

  callback()
};

そして、次のコードでそれを使用しようとしました:

byline(fs.createReadStream(filePath, {encoding: 'utf8'}))
  .pipe(new TransformStream())
  .pipe(fs.createWriteStream(filePath))

ただし、ファイルは空になります。

トランスフォーマーのコードが期待どおりに動作することを確信しています。なぜなら、パイプを試してみたところprocess.stdout、出力がまさに希望どおりだったからです。

私の質問は、私が間違っていることと、それを修正するために何を試みることができるかということです。

4

1 に答える 1

2

これはトランスフォーマー コードの問題ではありませんが、書き込み用にファイルを開いて、おそらくファイルから何かを読み取る前に上書きするという問題です。

シェルでも同じです。実行する場合:

cat < file.txt > file.txt

また:

tr a-z A-Z < x.txt > x.txt

ファイルが空になります。

一時ファイルにパイプしてから、古いファイルを新しいファイルに置き換える必要があります。または、古いファイルの名前を別の一時的な名前に変更し、新しいファイルを正しい名前で開き、名前を変更したファイルを古いファイルにパイプして、途中で変換します。

一時ファイルの名前を作成するには、必ず安全な方法を使用してください。次のようなモジュールを使用できます。

于 2016-12-23T13:14:08.593 に答える