使用Node.js直接访问磁盘

时间:2016-08-04 13:08:21

标签: javascript c++ node.js file disk

我想创建Node.js模块,该模块在Windows上提供直接磁盘访问。它必须能够读取,写入和搜索物理驱动器或虚拟设备。因为内置模块fs依赖于C++中编写的本机代码,它使用系统函数CreateFile支持\\.\PhysicalDriveX字符串作为参数来获取对物理驱动器的访问权限,我'我试图在Node.js做同样的事情。我的代码工作正常,应用程序成功打开磁盘以进行读写访问,但readwrite命令存在问题。

当我想从磁盘读取整个扇区或多个扇区时,它可以正常工作并显示字节。但是,当我尝试读取扇区的一半或几个字节时,它会显示错误:

Error: EINVAL: invalid argument, read
    at Error (native)
    at Object.fs.readSync (fs.js:731:19)

这对我来说不是一个无法解决的问题。我已经改进了我的read函数,所以它扩展缓冲区以匹配ceiled请求的扇区大小(即如果它需要从第一个扇区的一半读取磁盘到第三个扇区的一半,它将读取整个第一个,第二个扇区和第三个扇区,然后它将切片缓冲区)。为了更容易使用,我将缓冲区的大小修改为512字节,因此我的readwrite函数的唯一参数是扇区号,数据将从该扇区号读取到缓冲区或其中数据将从缓冲区写入。函数read正常工作,我可以从驱动器的任何扇区获取字节。

真正的问题是我的write功能。它只能将数据写入第一个扇区。如果我尝试将数据写入任何其他扇区期望第一个,我会收到以下错误:

Error: EPERM: operation not permitted, write
    at Error (native)
    at Object.fs.writeSync (fs.js:786:20)

我尽一切努力摆脱这个问题,但我不冷静。我试图更改驱动器,更改缓冲区大小(将其扩展到群集大小而不是扇区大小),使用fs.write而不是fs.writeSync,我也尝试在线搜索解决方案,但我冷静了找到答案。为了找出它不起作用的原因,我使用内置的Node.js调试器调试了我的程序。我发现线程突然从fs.readSync跳转到Error函数而没有任何合理的解释,并且该过程终止。

如何正确使用fs.writeSync函数将任何扇区写入物理驱动器?我做错了什么,或者Node.js有问题吗?

1 个答案:

答案 0 :(得分:1)

我们昨天发布了针对Node.js的原生添加,其中包含用于在Node.js(跨平台)上执行直接IO的帮助程序和文档:

https://github.com/ronomon/direct-io

我认为在您的情况下,您可能需要研究Windows上的特殊写入限制(以及FSCTL_LOCK_VOLUME的需要,以便您可以写入所有扇区而不仅仅是主引导记录。)

您还需要对齐的缓冲区。

该模块将帮助您满足这两个要求。