【问题标题】:Read file in node.js while it is opened for writing by another software读取 node.js 中的文件,同时打开它以供其他软件写入
【发布时间】:2019-02-13 10:37:51
【问题描述】:

情况: 1. 一个应用程序(不是node.js)向某个文件写入数据,大小未知 2. Node.js 应该管道该文件的内容,直到它被第一个应用程序打开以供写入。

有可能吗?

【问题讨论】:

  • 您刚刚描述了套接字的概念。你的具体问题是什么?你写过什么代码吗?
  • 文件是文本文件还是字节流?

标签: node.js stream


【解决方案1】:

你有办法。

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)

【讨论】:

  • 我认为这可能会帮助我解决我的问题,希望你不介意我问几个问题。 process.stdout,是正在读取的文件的数据吗?你能用socket.io-client发出它吗?如果是,我将如何去做?将 io.emit() 放在 pipe() 中似乎不是正确的方法
  • 您能打开一个新问题添加您的代码吗?我不是 socket.io 用户,启动代码会帮助我尝试一下
  • 抱歉,我不能再发布问题了。但如果它有帮助,我会在这里更详细地解释它。我正在尝试使用 socket.io-client 将仍在写入的音频文件(使用 github.com/gillesdemey/node-record-lpcm16)发送到 API(类似于此文档 docs.marsview.ai/realtime-speech-analytics-api/initiate-stream)。我想知道是否可以使用您的代码来读取正在编写的内容并将其发送到 API
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2020-07-27
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多