如何在Node中进行文件描述符的流传输?

13

fs.createReadStream()fs.createWriteStream() 只支持文件 路径,但我需要从文件描述符(传递给/来自子进程)读取(或写入)。

请注意,我需要使用流,因此fs.open/fs.read/fs.write 不足以满足需求。

2个回答

23
当你调用 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 选项,则忽略文件名。


3
太好了!我发现反过来也是可行的,使用fs.createWriteStream(null, {fd: fd})。奇怪的是这个方法在手册里没有记录,但它非常有效。 - Bartvds
1
如果你仔细看我链接的文档,你会发现它至少在文档中有所暗示,尽管我承认我是在源代码中找到的。 :) - Joe Hildebrand
是的,但所有其他fs方法都有针对文件描述符的特殊版本。我确实注意到了fd参数,但没有任何提示表明您可以将null用作路径。很奇怪。 - Bartvds
3
你需要传递空字符串,像这样 fs.createReadStream('', {fd: fd}) 而不是 null - Vad
4
LOL "仔细看" - Alexander Mills

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接