Как выполнить потоковую передачу в / из файлового дескриптора в node?

#node.js #stream #file-descriptor #child-process

#node.js #поток #файловый дескриптор #дочерний процесс

Вопрос:

fs.createReadStream() И fs.createWriteStream() поддерживают только пути к файлам, но мне нужно прочитать (или записать) из файлового дескриптора (переданного дочернему процессу / из него).

Обратите внимание, что мне нужны потоки, поэтому fs.open/fs.read/fs.write их недостаточно.

Ответ №1:

Когда вы вызываете fs.createReadStream, вы можете передать файловый дескриптор:

 var fs = require('fs');
var fd = fs.openSync('/tmp/tmp.js', 'r');
var s = fs.createReadStream(null, {fd: fd});
s.pipe(process.stdout);
  

Если есть fd опция, имя файла игнорируется.

Комментарии:

1. Отлично! Я обнаружил, что обратное также работает с fs.createWriteStream(null, {fd: fd}); . Странно, это не задокументировано в руководстве, но работает как по волшебству.

2. Если вы внимательно посмотрите документ, на который я ссылался, вы увидите, что на это, по крайней мере, есть намек в документах, хотя я признаю, что нашел это в исходном коде. 🙂

3. Да, но все другие методы fs имеют специальные версии для файловых дескрипторов. Я заметил параметр fd, но ничто не указывает на то, что вы могли бы использовать null в качестве пути. Странно это.

4. Вам нужно передать пустую строку, подобную этой, fs.createReadStream('', {fd: fd}) вместо null .

5. LOL «смотри внимательно»

Ответ №2:

 // Open amp;3:
process.oob1 = fs.createWriteStream(null, { fd: 3 });
// Write to amp;3 / oob1 (out-of-band 1)
process.oob1.write("Note: this will throw an exception without 3>amp;1 or something else declaring the existence of amp;3");