【问题标题】:Enumerate system drives in nodejs枚举nodejs中的系统驱动器
【发布时间】:2013-03-30 12:39:10
【问题描述】:

有没有办法检索计算机上所有逻辑驱动器的驱动器名称?

我查看了 fs api,但从那里我只能枚举给定目录的文件和目录。

【问题讨论】:

  • 您的目标是哪个系统?解决方案是否需要跨平台工作,还是可以针对特定平台?
  • 我的目标是windows,不需要跨平台

标签: node.js windows


【解决方案1】:

使用DiskPart 命令怎么样?在命令行中运行diskpart list 是否会为您提供所需的输出?如果是这样,您可以使用 child_process.exec

在节点中执行此操作
var exec = require('child_process').exec
var cmd = 'diskpart list'
exec(cmd, function(err, stdout, stderr) {
    if (err) {
        console.log('error running diskpart list command')
        console.log(err)
        return
    }
    console.log('stdout data')
    console.log(stdout)

    console.log('stderr data')
    console.log(stderr)
})

【讨论】:

  • 可以,但是我想避免运行子进程并解析命令输出。但如果节点的 API 中没有任何内容,我可能会采用这种方式......
  • 我相信这是你要做的最好的事情。 node.js 本身没有任何方法可以做到这一点。在 OSX 上,您可以读取 /Volumes/ 目录,在 linux 上您可以查看 /mnt,但 Windows 没有为您提供已安装驱动器的目录。另请注意computerhope.com/issues/ch000854.htm#2 和 wmic logicaldisk get name
【解决方案2】:

我不确定您所说的“驱动器名称”是什么意思。如果您指的是\\.\PhysicalDriveN 形式的驱动器,我遇到了同样的问题并实现了这个适用于所有主要操作系统的模块:

https://github.com/resin-io/drivelist

对于 Windows,您会获得如下信息:

[
    {
        device: '\\\\.\\PHYSICALDRIVE0',
        description: 'WDC WD10JPVX-75JC3T0',
        size: '1000 GB'
    },
    {
        device: '\\\\.\\PHYSICALDRIVE1',
        description: 'Generic STORAGE DEVICE USB Device',
        size: '15 GB'
    }
]

【讨论】:

  • 这是正确的跨平台解决方案!如果你在 nodejs 中只为一个操作系统创建一个应用程序,那你就错了!
  • 如果您在npm install drivelist 期间未能构建,只需安装此库的旧版本。
  • 我在尝试检索驱动器时收到此错误:This version of Node.js requires NODE_MODULE_VERSION 75。知道该怎么做吗?我已经尝试过重建和重新安装
【解决方案3】:

如果你的目标是 Windows,你可以试试这个:

此解决方案基于 this post 的想法。

我用承诺包装它。

var spawn = require("child_process").spawn

function listDrives(){
    const list  = spawn('cmd');

    return new Promise((resolve, reject) => {
        list.stdout.on('data', function (data) {
            // console.log('stdout: ' + String(data));
            const output =  String(data)
            const out = output.split("\r\n").map(e=>e.trim()).filter(e=>e!="")
            if (out[0]==="Name"){
                resolve(out.slice(1))
            }
            // console.log("stdoutput:", out)
        });

        list.stderr.on('data', function (data) {
            // console.log('stderr: ' + data);
        });

        list.on('exit', function (code) {
            console.log('child process exited with code ' + code);
            if (code !== 0){
                reject(code)
            }
        });

        list.stdin.write('wmic logicaldisk get name\n');
        list.stdin.end();
    })
}

listDrives().then((data) => console.log(data))

测试一下,你会看到如下结果:

["c:", "d:"]

【讨论】:

    【解决方案4】:

    基于Edwin Lees 的回答:

    const child = require('child_process');
    
    child.exec('wmic logicaldisk get name', (error, stdout) => {
        console.log(
            stdout.split('\r\r\n')
                .filter(value => /[A-Za-z]:/.test(value))
                .map(value => value.trim())
        );
    });
    

    输出:['C:', 'D:']

    【讨论】:

      【解决方案5】:

      @Bagherani 的降级建议 +1!

      我使用的是 Electron React Boilerplate v4.0,无法加载驱动列表。我降级到 drivelist@5.2.12,它可以满足我的需求。

      【讨论】:

        猜你喜欢
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 2010-09-22
        • 2012-11-24
        • 2013-09-10
        相关资源
        最近更新 更多