【发布时间】:2015-05-06 01:58:51
【问题描述】:
我有一个 Node.js 脚本,它读取文件的内容,对其内容进行一些转换,并记录输出:
var transformer = require('./transformer'),
fs = require('fs'),
file = process.argv[2];
if (!file) {
throw 'no file specified\n';
}
fs.readFile(file, 'utf-8', function (err, data) {
if (err) {
throw err;
}
transformer.transform(data, function (text) {
console.log(text);
});
});
这很好用:
$ node transform.js myfile.txt
这很有效:
$ node transform.js myfile.txt > anotherfile.txt
但是,当我尝试将输出重定向到我正在读取的同一文件时,该文件变为空白:
$ node transform.js myfile.txt > myfile.txt
同样的事情使用tee:
$ node transform.js myfile.txt | tee myfile.txt
奇怪的是,这行得通:
$ node transform.js myfile.txt >> myfile.txt
但我不想追加到文件中 - 我想覆盖它的内容。
我认为问题在于,由于 fs.readFile 是异步的,console.log 也被异步调用 - 即,它一次获取数据块而不是所有数据。我想我可以改用fs.readFileSync,但是处理这个问题的正确方法是什么?
【问题讨论】:
-
当您检查记事本时,您认为文件句柄仍然打开吗?如果我没记错,只要文件句柄打开,数据并没有真正写入文件,尽管在调试期间步骤它可能会说写作已经完成。 (从 c# 的角度来看),记事本也是出了名的不可靠(在目视检查期间),因为即使文件本身打开,您也可以删除记事本。
-
跟nodejs没关系。这就是外壳的工作方式。这样做的传统方式是
node transform.js myfile > tmp;mv tmp myfile
标签: javascript node.js asynchronous console.log