javascript - 使用 Node.js 直接磁盘访问

标签 javascript c++ node.js file disk

我想创建 Node.js 模块,它在 Windows 上提供直接磁盘访问。它必须能够读取、写入和搜索物理驱动器或虚拟设备。因为内置模块fs取决于 C++ 中编写的 native 代码使用系统功能CreateFile它支持\\.\PhysicalDriveX字符串作为参数来访问物理驱动器,我尝试在 Node.js 中执行相同的操作。我的代码工作正常,应用程序成功打开磁盘进行读写访问,但 read 有问题和write命令。

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

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

这对我来说并不是一个无法解决的问题。我改进了我的read函数,因此它扩展缓冲区以匹配上限请求的扇区大小(即,如果需要从第一个扇区的一半读取磁盘到第三个扇区的一半,它将读取整个第一个、第二个和第三个扇区,然后对缓冲区进行切片)。为了更容易使用,我将缓冲区的大小固定为 512 字节,因此我的 read 的唯一参数和write功能是将数据读取到缓冲区或将数据从缓冲区写入其中的扇区号。功能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 有问题?

最佳答案

我们昨天发布了 Node.js 的 native 插件,其中包含用于在 Node.js 上进行直接 IO(跨平台)的帮助程序和文档:

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

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

您还需要对齐的缓冲区。

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

关于javascript - 使用 Node.js 直接磁盘访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38768257/

相关文章:

c++ - zmq错误代码156384763的原因

c++ - 编译大型头文件 C++

c++ - Eclipse "Type Not Resolved"问题

javascript - 某些触摸事件后选择了多个选项卡

javascript - 仅针对特定 div/s 运行 javascript

javascript - 如何在javascript中复制引用的值?

node.js - 使用 Iisnode 在 IIS 中运行 Ghost

ajax - 在结束 AJAX 请求之前等待 node.js 回调完成

node.js - Nodejs Meanio 模块 - init 命令不起作用

javascript - document.form[0] 不适用于 Firefox