【发布时间】:2019-02-13 10:37:51
【问题描述】:
情况: 1. 一个应用程序(不是node.js)向某个文件写入数据,大小未知 2. Node.js 应该管道该文件的内容,直到它被第一个应用程序打开以供写入。
有可能吗?
【问题讨论】:
-
您刚刚描述了套接字的概念。你的具体问题是什么?你写过什么代码吗?
-
文件是文本文件还是字节流?
情况: 1. 一个应用程序(不是node.js)向某个文件写入数据,大小未知 2. Node.js 应该管道该文件的内容,直到它被第一个应用程序打开以供写入。
有可能吗?
【问题讨论】:
你有办法。
writeStream.js 是一个简单的测试类,可以作为演示写入文件
const fs = require('fs')
const fd = fs.openSync('./openedFile.txt', 'w+')
const stream = fs.createWriteStream(null, {
fd,
encoding: 'utf8'
})
process.stdin.pipe(stream)
readStream 轮询:这很简单,当读取流到达文件末尾 (EOF) 并触发 'end' 事件时,它总是关闭。因此,如果您全部阅读,则无法将打开的 fd 保留到文件中。 (在这个例子中,我不管理流是否仍然打开,因为它无法读取所有文件)
const fs = require('fs')
let streamed = 0
function readFd() {
const fd = fs.openSync('./openedFile.txt', 'r')
const stream = fs.createReadStream(null, {
fd,
encoding: 'utf8',
start: streamed
})
stream.on('data', function (chunk) {
streamed += chunk.length;
})
stream.pipe(process.stdout)
}
setInterval(readFd, 1000)
readStream via tail(tail 命令会为你轮询)
const { spawn } = require('child_process');
const child = spawn('tail', ['-f', 'openedFile.txt']);
child.stdout.pipe(process.stdout)
【讨论】: