gpt4 book ai didi

Node.js 转换文件流并写入同一文件会导致空文件

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:17 25 4
gpt4 key购买 nike

我正在尝试使用 Node 文件流和自定义转换函数修改一些文件。这是转换函数:

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 并且输出正是我想要的。

我的问题是:我做错了什么以及我可以尝试解决什么问题?

最佳答案

这不是您的转换器代码的问题,而是您打开一个文件进行写入的问题,您可能在从中读取任何内容之前就覆盖了该文件。

在 shell 中也是一样的。如果你运行:

cat < file.txt > file.txt

或者:

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

这将导致文件变空。

您必须通过管道传输到临时文件,然后用新文件替换旧文件。或者,也可以将旧文件重命名为其他临时名称,以正确的名称打开新文件,并将重命名的文件通过管道传输到旧文件,从而进行转换。

确保使用安全的方式为临时文件命名。您可以使用如下模块:

关于Node.js 转换文件流并写入同一文件会导致空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com