2013-04-08 3 views
2

Есть ли способ получить имя диска для всех логических дисков на компьютере?Перечислить системные диски в nodejs

Я посмотрел fs api, но оттуда я могу только перечислять файлы и каталоги данного каталога.

+0

какую систему вы ориентацию? Требуется ли решение для работы на платформе или может быть специфичной для платформы? – Noah

+0

Я нацелился на окна, и мне не нужно быть кросс-платформой – foobarcode

ответ

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) 
}) 
+0

Это сработало бы, но я бы хотел избежать запуска дочернего процесса и разбора вывода команды. Но это было бы, вероятно, тем, к чему я прибегу, если в API-интерфейсе нет ничего ... – foobarcode

+1

Я считаю, что это лучшее, что вы собираетесь делать. node.js не имеет никакого способа сделать это изначально. В OSX вы можете прочитать каталог '/ Volumes /', а в linux вы можете посмотреть '/ mnt', но Windows не предоставляет каталог установленных дисков для вас. Также обратите внимание на http://www.computerhope.com/issues/ch000854.htm#2 и wmic logicaldisk получить имя – Noah

+0

Хорошо, что я не знал об этом, спасибо за ваш ответ – foobarcode

8

Я не уверен, что вы подразумеваете под «имя диска». Если вы имеете в виду дисков в виде \\.\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' 
    } 
] 
+0

Это правильное и кросс-платформенное решение! Если вы создаете приложение в nodejs только для одной ОС, вы делаете это неправильно! – tborychowski

0

Если вы ориентируетесь на 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)) 

Test, вы увидите результат, как:

["c:", "d:"] 
Смежные вопросы