Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.js直接访问磁盘_Javascript_C++_Node.js_File_Disk - Fatal编程技术网

Javascript 使用Node.js直接访问磁盘

Javascript 使用Node.js直接访问磁盘,javascript,c++,node.js,file,disk,Javascript,C++,Node.js,File,Disk,我想创建Node.js模块,它在Windows上提供直接磁盘访问。它必须能够读取、写入和搜索物理驱动器或虚拟设备。由于内置模块fs依赖于用C++编写的本机代码,它使用支持\\.\PhysicalDriveX字符串的系统函数CreateFile作为参数来访问物理驱动器,因此我在Node.js中也尝试了同样的方法。我的代码工作正常,应用程序成功打开磁盘进行读写访问,但读和写命令存在问题 当我想从磁盘读取整个扇区或多个扇区时,它可以正常工作并正确显示字节。但是,当我尝试读取半个扇区或几个字节时,它会显

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

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

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.js上执行直接IO的帮助程序和文档(跨平台):

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

您还需要对齐的缓冲区


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

为什么不读取完整的扇区,截断您以后不需要的部分以获取单个字节?@DrakaSAN。你把我的问题读到最后了吗?我说我已经完全解决了这个问题,读取整个扇区,然后截断缓冲区。对不起,大脑放屁了,我不知怎么地认为有两个问题。
写入
的权限有错误,您确定(和/或应用程序)对该扇区有写入权限吗?你试过管理模式吗?@DrakaSAN。我以管理员身份运行命令提示符,并从中执行Node.js。我是否需要向Node.js传递一些附加参数以授予其管理员权限?