我有一个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代替,但是有什么正确的方法来处理这个问题呢?
发布于 2015-05-06 02:41:24
这个问题实际上不是在节点内部,而是在shell中。当您使用>重定向时,shell所做的第一件事就是打开文件进行写入,清空文件。您的程序将从该空文件中读取,在您的示例中,空输入意味着空输出。
这也将导致一个空文件,而不管myfile.txt的初始内容如何。
$ cat myfile.txt > myfile.txt 一种解决方案是在Node脚本中编写文件,而不是使用重定向。您已经在那里指定和读取文件,那么为什么不也在argv中指定一个输出文件并将其写入,而不是使用shell重定向呢?只需注意构造代码,以便读取和写入相同的文件即可。
正如@slebetman在评论中指出的那样,另一种解决方案是cat myfile.txt > tmp; mv tmp myfile.txt (或者我的首选:cat myfile.txt > tmp && mv tmp myfile.txt)。
发布于 2015-05-06 02:37:58
问题是
我认为你想要的是:
有几种方法可以做到:
1)同步读取文件。Node.js 0.12支持这一点。
var transformer = require('./transformer'),
fs = require('fs'),
file = process.argv[2];
if (!file) {
throw 'no file specified\n';
}
fs.readFileSync(file, 'utf-8', function (err, data) {
if (err) {
throw err;
}
transformer.transform(data, function (text) {
console.log(text);
});
});2)使用“溪流”
这真的是最好的方法。尤其是如果你想学习Node.js
我所知道的了解流的最好方法是从NodeSchool:http://nodeschool.io/#workshoppers,试试stream-adventure。
到最后,您将拥有自己的这类问题。
祝好运!
https://stackoverflow.com/questions/30066192
复制相似问题