我想创建的Node.js模块,提供直接的磁盘访问视窗。它必须能够读取、写入和搜索物理驱动器或虚拟设备。因为内置模块fs依赖于用C++编写的本机代码,它使用支持\\.\PhysicalDriveX字符串作为参数的系统函数CreateFile来访问物理驱动器,所以我尝试在Node.js中做同样的事情。我的代码运行良好,应用程序成功打开磁盘进行读写访问,但read和write命令有问题。
当我想要从磁盘读取整个扇区或多个扇区时,它可以正确地工作并显示字节。但是,当我尝试读取一个扇区的一半或几个字节时,它显示错误:
Error: EINVAL: invalid argument, read
at Error (native)
at Object.fs.readSync (fs.js:731:19)对我来说,这不是一个无法解决的问题。我已经改进了我的read函数,所以它扩展了buffer以匹配上限的请求扇区大小(即,如果它需要从第一个扇区的一半到第三个扇区的一半读取磁盘,它将读取整个第一个、第二个和第三个扇区,然后它将对缓冲区进行切片)。为了便于使用,我将缓冲区的大小固定为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有问题?
发布于 2017-09-27 16:14:04
我们昨天发布了一个原生的Node.js插件,提供了在Node.js (跨平台)上进行直接IO的助手和文档:
https://github.com/ronomon/direct-io
我认为在你的情况下,你可能需要考虑Windows上的特殊写限制(以及FSCTL_LOCK_VOLUME的需求,这样你就可以写到所有扇区,而不仅仅是主引导记录)。
您还需要对齐的缓冲区。
该模块将帮助您满足这两个要求。
https://stackoverflow.com/questions/38768257
复制相似问题