如果使用 openSync 打开文件,如何在 node.js 中获取文件描述符

Posted

技术标签:

【中文标题】如果使用 openSync 打开文件,如何在 node.js 中获取文件描述符【英文标题】:How to get file descriptor in node.js if you open file using openSync 【发布时间】:2013-04-12 22:26:14 【问题描述】:

我注意到 openSync 可能存在的一个大问题是,当您使用 openSync 打开文件时,您不会获得文件描述符。如果您使用异步调用打开,则只能将其作为回调的参数。问题是您必须拥有文件描述符才能关闭文件!程序员可能还想对需要文件描述符的文件执行其他操作。

如果您使用同步调用打开,则 node.js 的 fs API 中似乎有一个重大遗漏,即没有提供一种方法来访问在异步模式下打开时回调返回的 fd 变量。这实质上会使同步打开对大多数应用程序不可用。

如果可以避免的话,我真的不想在以后的开发中使用异步文件打开和关闭,有什么方法可以获取我需要在使用同步时成功关闭文件的 fd 变量打开了吗?

【问题讨论】:

【参考方案1】:

除了文件描述符之外,您还能从 openFileSync 获得什么?

var fs = require('fs')
var path = require('path')
var fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a')
fs.writeSync(fd, 'contents to append')
setTimeout(function () 
  console.log('closing file now')
  fs.closeSync(fd)
, 10000)

在上面的节点脚本运行时运行lsof /path/to/log.txt,脚本完成后再次运行lsof /path/to/log.txt表明文件正在正确关闭

这就是说你想通过打开文件来完成什么?也许有更好的方法,例如针对您的特定情况进行流式传输

【讨论】:

感谢您的快速回答!用你的例子,你是对的,它就像一个魅力。这是有道理的,它会在 openSync 之后返回 fd,API 只是没有明确说明,而且我在发布问题之前没想过尝试它。我只是想记录一些时序数据以在我的系统上进行测试,我是一个 C/C++ 人,试图自己找出 node.js,文件对我来说很熟悉,但我会去看看根据您的建议流式传输,看看它们是否更适合我在 node.js 中使用。再次感谢! 没问题。 node.js 文档大部分都很好。有时虽然他们假设了很多读者并且有点过度截断

以上是关于如果使用 openSync 打开文件,如何在 node.js 中获取文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

Notepad++如何关闭最近打开的文件的历史记录功能

如何使用`docker cp``--no-clobber`?从Docker容器复制文件,但如果目标已经存在,则不覆盖]]

在 cmake 文件中打开 no_keyword(Qt 选项)以使用 boost::signals

打开文件时显示No language support detected是啥意思,应该如何解决

如何在纯净的Centos7 中安装 Mysql8.0

Python 安装zbar-py时出现 无法打开包括文件: “unistd.h” no such file or directory