如果你们必须知道我实际上在做什么,那么就是这样:https://github.com/Meigyoku-Thmn/CSBinary(来自.NET Core的BinaryReader和BinaryWriter的端口(。
问题是,我的库没有文件缓冲(请再说一遍,这与NodeJS中的Buffer类无关(,我想利用C运行时的I/O系统,而不必编写BufferedFile类(想想.NET中的BufferedStream类(
在C语言中,如果您打开/创建一个文件(fopen(并获得一个file*实例,那么它在后台执行文件缓冲,您甚至可以使用setvbuf函数设置文件缓冲区大小(同样,与buffer类无关(。
我认为,如果我手头有一个文件描述符(由fs模块创建(,我可以使用fdopen函数将其包装/关联到file*实例中,并免费获得内置C运行时的文件缓冲。
不幸的是,NodeJS似乎是使用静态链接构建的。因此,我的插件使用了独立于NodeJS使用的C运行时。从NodeJS创建的文件描述符不能直接在我的插件中使用,libuv也没有类似于fdopen的东西。
根据NodeJS文档中的这一节,存在节点gyp将";下载完整的源tarball";让我">可以完全访问Node.js依赖项的完整集合";。这可能是一种方式,但除了指定nodedir标志(这需要我手动准备"一个本地Node.js源映像"(之外,文档还相当模糊。
这是一条死胡同吗?任何有经验的人,请帮帮我。
最终,我找到了一种方法:
int nodejs_fd = gotFromJs();
// on POSIX-system, fd is process-wide, so I don't have to do anything
int fd = nodejs_fd;
// but on Windows, fd is just simulated on top of OS-Handle
// so it's bound to a specific C runtime, and my addon use a separate C runtime.
// therefore, I cannot just pass it to fdopen (EBADF)
// but I can still get the OS-handle
#ifdef _WIN32
HANDLE fh = (HANDLE)uv_get_osfhandle(nodejs_fd);
// so I can just open my own fd that points to it, side-by-side with the fd of NodeJS
fd = _open_osfhandle((intptr_t)fh, _O_RDONLY);
#endif
// and problem solved
FILE* file = fdopen(fd, "rb");