У меня есть сценарий 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
, но каков правильный способ справиться с этим?
Как вы думаете, дескриптор файла по-прежнему открыт, когда вы проверяете блокнот ?, если im не ошибается, пока открыт дескриптор файла, данные буквально не записываются в файл, хотя во время шагов отладки он, вероятно, мог сказать письмо уже было сделано. (с точки зрения C#), также блокноты, как известно, ненадежны (во время проверки глаз) из-за того, что вы можете удалить блокнот, даже если сам файл открыт. –
Это не связано с nodejs. Это то, как работает оболочка. Традиционным способом сделать это будет 'node transform.js myfile> tmp; mv tmp myfile' – slebetman