1

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

一些脚本语言似乎对大文件偏移有不完整的支持,这取决于它们是否在 32 位/64 位操作系统或处理器上运行,或者是否需要使用某些标志进行专门编译。

因此,无论如何我都想尝试使用 node.js,但是在谷歌搜索中,我在它对 64 位偏移量的大文件的支持(或者它的库/框架支持等)方面都没有找到太多的方法。

我意识到这在某种程度上至少取决于 JavaScript 的底层整数支持。如果我正确阅读了什么是 JavaScript 的 Max Int?Number 可以达到的最高 Integer 值是多少而不会丢失精度?似乎 JavaScript 在内部甚至对整数也使用浮点数,因此

最大精确整数值为 2 53

再一次,node.js 是为服务器设计的,服务器应该期望支持大文件。

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


更新

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

到目前为止,我不确定这是否仅是 .js 中的限制fs、node.js 中的错误,还是仅 Windows 版本中的问题。

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

4

2 回答 2

1

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

就库而言,它在创建读写流时使用 Number for start(and ) 选项(参见 fs.createReadStream)。end这意味着您可以通过节点寻址到位置 2^53(如此处所示:也相关:JavaScript 的最高整数值是多少,一个数字可以达到而不会丢失精度?lib/fs.js )这在代码中是可见的。

于 2012-12-01T18:42:56.453 回答
1

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

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

在使用较大偏移量时的早期版本故障模式中,故障模式从静默搜索到文件开头到使用EINVAL.

请参阅(现已关闭)错误报告:

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

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

if (process.version.substring(1).split('.') >= [0,7,9]) {
  // use 64-bit file offsets...
}
于 2012-12-25T02:56:08.383 回答