【发布时间】:2015-04-28 15:12:00
【问题描述】:
我正在尝试为 Node.js 实现一个例程,该例程允许打开一个文件,此时其他进程正在附加该文件,然后在附加到数据块时立即返回它们文件。它可以被认为类似于tail -f UNIX 命令,但是当块可用时立即执行,而不是轮询随时间的变化。或者,可以将其视为处理文件,就像处理套接字一样——期望 on('data') 不时触发,直到文件被显式关闭。
在 C 语言中,如果我要实现这个,我只需打开文件,将其文件描述符提供给 select()(或具有类似名称的任何替代函数),然后在文件描述符标记为“时读取块”可读”。所以,当没有什么要读的时候,它就不能读了,当有东西附加到文件中时,它又可以读了。
对于以下 Javascript 代码示例,我有点预料到这种行为:
function readThatFile(filename) {
const stream = fs.createReadStream(filename, {
flags: 'r',
encoding: 'utf8',
autoClose: false // I thought this would prevent file closing on EOF too
});
stream.on('error', function(err) {
// handle error
});
stream.on('open', function(fd) {
// save fd, so I can close it later
});
stream.on('data', function(chunk) {
// process chunk
// fs.close() if I no longer need this file
});
}
然而,这个代码示例只是在遇到 EOF 时退出,所以我不能等待新的块到达。当然,我可以使用fs.open 和fs.read 重新实现它,但这有点违背Node.js 的目的。或者,我可以fs.watch() 文件进行更改,但它不能通过网络工作,而且我不喜欢一直重新打开文件而不是保持打开状态的想法。
我试过这样做:
const fd = fs.openSync(filename, 'r'); // sync for readability' sake
const stream = net.Socket({ fd: fd, readable: true, writable: false });
但是没有运气——net.Socket 不高兴并抛出了TypeError: Unsupported fd type: FILE。
那么,有什么解决办法吗?
UPD:这是不可能的,my answer 解释了原因。
【问题讨论】:
标签: javascript node.js file-io