使用 Node.js 直接访问磁盘
Direct disk access using Node.js
我想创建Node.js模块,该模块在Windows上提供直接磁盘访问。它必须能够读取、写入和搜索物理驱动器或虚拟设备。由于内置模块fs
依赖于用 C++
编写的本机代码,该代码使用系统函数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 的原生插件,其中包含在 Node 上执行直接 IO 的帮助程序和文档.js(跨平台(:
https://github.com/ronomon/direct-io
我认为在您的情况下,您可能需要研究Windows上的特殊写入限制(以及对FSCTL_LOCK_VOLUME
的需求,以便您可以写入所有扇区,而不仅仅是主引导记录(。
您还需要对齐的缓冲区。
该模块将帮助您满足这两个要求。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 防止临时对象文件访问 MSVC 中的磁盘
- 如何在C++中读取/写入大文件时减少 I/O 磁盘访问次数
- 管理磁盘上的许多 GB 数据,直接访问
- 成功写入会导致仅访问磁盘一次
- 如何创建文件路径可以像磁盘一样访问的虚拟文件系统
- CPP 快速访问磁盘上的二进制数据
- 使用 C/C++ 访问 RAW 磁盘
- 锁定互斥锁vs访问磁盘
- 使用 Node.js 直接访问磁盘