随机访问node.js中的大文件(需要支持64位文件偏移量)?

我正在考虑将部分跨平台脚本移植到node.js,部分是因为我现在更熟悉JavaScript,部分原因是由于其他脚本语言对大文件支持的问题。

某些脚本语言似乎对大文件偏移量有补丁支持,这取决于它们是在32位/ 64位操作系统还是处理器上运行,还是需要使用特定标志进行特定编译。

所以我想用node.js来试验,不过谷歌search对于64位偏移量的大文件我没有find任何支持它的方法(或者是库/框架支持等)。

我意识到在某种程度上,这至less取决于JavaScript的底层整数支持。 如果我正确地阅读什么是JavaScript的Max Int? 一个数字可以达到的最高整数值是什么? 看起来JavaScript在内部使用浮点,即使是整数也是如此

最大的确切积分值是2 53

然后,再次node.js是为服务器和服务器应该期望大文件的支持。

node.js是否支持64位文件偏移量?


UPDATE

尽pipe_LARGEFILE_SOURCE_FILE_OFFSET_BITS构build标志,现在我已经开始移植我的项目,需要这个,我发现fs.read(files.d.fd, chunk, 0, 1023, 0x7fffffff, function (err, bytesRead, data)成功,但0x80000000EINVAL失败。这是在32位Windows 7上运行的版本v0.6.11

到目前为止,我不确定这是否仅限于fs的限制,node.js中的错误,还是仅在Windows上构build的问题。

是否打算在所有平台的所有核心模块中的node.js中使用大于31位的文件偏移量?

Node.js在所有平台上都使用_LARGEFILE_SOURCE和_FILE_OFFSET_BITS进行编译,因此在内部对于大文件访问应该是安全的。 (请参阅源代码目录中的common.gypi 。)

就库而言,它在创build读写stream时使用Number作为start (和end )选项(请参阅fs.createReadStream)。 这意味着您可以通过节点来处理2 ^ 53的位置(如此处所示:也是相关的: 数字可以达到的JavaScript最高整数值,而不会失去精度? )这在lib/fs.js代码中是可见的。

追查起来有点困难,但自2012年5月底以来,node.js只支持0.7.9版本 (不稳定)以来的64位文件偏移量。从版本0.8.0开始的稳定版本,从6月底2012。

fs:fs调用的64位偏移量(Igor Zinkovsky)

在较早版本的失败模式中,当使用较大的偏移量时,失败模式会有所不同,从静默寻find文件的开始,以EINVAL引发exception。

查看(现在closures的)错误报告:

不支持超过31位的文件偏移量

从node.js代码中以编程方式检查大文件支持

 if (process.version.substring(1).split('.') >= [0,7,9]) { // use 64-bit file offsets... }