Node.js 转换文件流并写入同一文件导致空文件
Node.js transform file stream and write to same file results in empty file
我正在尝试使用节点文件流和自定义转换函数修改一些文件。这是转换函数:
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
这将导致文件为空。
您必须通过管道传输到一个临时文件,然后用新文件替换旧文件。或者将旧文件重命名为其他临时名称,以正确的名称打开新文件并将重命名的文件通过管道传输到旧文件,在途中进行转换。
确保使用安全的方式为临时文件命名。您可以使用像这样的模块:
我正在尝试使用节点文件流和自定义转换函数修改一些文件。这是转换函数:
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
这将导致文件为空。
您必须通过管道传输到一个临时文件,然后用新文件替换旧文件。或者将旧文件重命名为其他临时名称,以正确的名称打开新文件并将重命名的文件通过管道传输到旧文件,在途中进行转换。
确保使用安全的方式为临时文件命名。您可以使用像这样的模块: