How to stream to/from a file descriptor in node?
Asked Answered
M

2

13

The fs.createReadStream() and fs.createWriteStream() only support file paths but I need to read (or write) from a file descriptor (passed to/from a child process).

Note I need Streams, so fs.open/fs.read/fs.write are not sufficient.

Mainsheet answered 5/7, 2014 at 1:21 Comment(0)
M
24

When you call fs.createReadStream you can pass in a file descriptor:

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

If there is a fd option, the filename is ignored.

Middleton answered 5/7, 2014 at 4:11 Comment(5)
Excellent! I found the reverse also works, with fs.createWriteStream(null, {fd: fd});. Weird this is not documented in the manual, but it works like a charm.Mainsheet
If you stare carefully at the doc I linked to, you see that it's at least hinted at in the docs, although I admit that I found it in the source. :)Middleton
Yea, but all the other fs methods have spceial versions for file descriptors. I did notice the fd param but nothing suggest you could use null as path. Odd that.Mainsheet
You need to pass empty string like this fs.createReadStream('', {fd: fd}) instead of null.Planking
LOL "stare carefully"Lynd
J
4
// Open &3:
process.oob1 = fs.createWriteStream(null, { fd: 3 });
// Write to &3 / oob1 (out-of-band 1)
process.oob1.write("Note: this will throw an exception without 3>&1 or something else declaring the existence of &3");
Jonson answered 28/9, 2015 at 18:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.