当其他软件打开文件进行写入时,读取 Node.js 中的文件

Lis*_*sio 1 stream node.js

情况: 1. 一个应用程序(不是 Node.js)将数据写入某个文件,大小未知 2. Node.js 应该通过管道传输该文件的内容,直到第一个应用程序打开该文件进行写入。

是否可以?

Man*_*lon 5

你有一些解决方案。

writeStream.js是一个简单的测试类,可以作为 demo 写入文件中

const fs = require('fs')
const fd = fs.openSync('./openedFile.txt', 'w+')
const stream = fs.createWriteStream(null, {
  fd,
  encoding: 'utf8'
})
process.stdin.pipe(stream)
Run Code Online (Sandbox Code Playgroud)

readStream 轮询:这很简单,读取流在到达文件末尾 (EOF) 时始终关闭,并且会触发“结束”事件。因此,如果您读取了所有文件,则无法将打开的 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)
Run Code Online (Sandbox Code Playgroud)

通过 tail 读取流(tail 命令将为您轮询)

const { spawn } = require('child_process');
const child = spawn('tail', ['-f', 'openedFile.txt']);
child.stdout.pipe(process.stdout)
Run Code Online (Sandbox Code Playgroud)