Node.js - Найти домашний каталог в зависимости от платформы

216

Process.platform возвращает «win32» для Windows. В Windows домашним каталогом пользователя может быть C: \ Users [ИМЯ ПОЛЬЗОВАТЕЛЯ] или C: \ Documents and Settings [ИМЯ ПОЛЬЗОВАТЕЛЯ] в зависимости от того, какая версия Windows используется. В Unix это не проблема.

Мэтью
источник
Сохраняет ли Mac OS X метод Unix или ему тоже нужно что-то другое?
hippietrail
2
@hippietrail Mac OS X использует HOME, как и любой другой Unix.
Марнен Лайбоу-Козер

Ответы:

333

Как упоминалось в более недавнем ответе , предпочтительный способ теперь просто:

const homedir = require('os').homedir();

[Оригинальный ответ] : почему бы не использовать USERPROFILEпеременную окружения на win32?

function getUserHome() {
  return process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'];
}
maerics
источник
Спасибо. Только что установил Node.js локально, так как создание базового сервера на Cloud9 не следует моему маленькому учебнику (конечно) ... и не имел ИДЕИ, куда помещать мои файлы. Ты человек! (Я полагаю)
Стив
В 0.10.33 win 64bit это не работает. У меня USERPROFILE и HOME установлен на C: Моя компания вынуждает меня установить HOMEDRIVE / HOMEPATH в сетевой ресурс H :. По какой-то причине узел предпочитает H :.
Ангус
9
У меня есть внутренне негативная реакция на этот ответ и второй по популярности. Если вы используете node.js, тогда IMHO, вам следует отдать предпочтение модулям npm, таким как os.homedir () и osenv.home () (оба упомянуты ниже). Если вы посмотрите на источник для os.homedir (), вы увидите, что это не так просто.
Ларри Макчероне
Это не платформенное средство.
Майкл
перенос a path.resolve()может обеспечить некоторую нормализацию в терминах конечных слэшей, потенциально нечетных прямых / обратных слешей и т. д. (особенно если вы получили файловые операции после получения этой информации)
Фрэнк
237

os.homedir()был добавлен этим PR и является частью общедоступной версии 4.0.0 nodejs.


Пример использования:

const os = require('os');

console.log(os.homedir());
Коди Аллан Тейлор
источник
Добро пожаловать в стек переполнения! Пожалуйста, не забудьте сформулировать свой ответ как ответ , а не как вопрос.
durron597
2
Понял. Добавлены источники, потому что os.homedir()это чертовски новая игрушка.
Коди Аллан Тейлор
8
должен быть принят ответ, так как он совместим с кроссплатформенностью
Яхья Уддин
2
Вы должны добавить const os = require('os');тоже
Roel
81

Что ж, было бы точнее полагаться на функцию, а не на значение переменной. Тем более, что есть 2 возможные переменные для Windows.

function getUserHome() {
  return process.env.HOME || process.env.USERPROFILE;
}

РЕДАКТИРОВАТЬ : как уже упоминалось в более недавнем ответе, https://stackoverflow.com/a/32556337/103396 - это правильный путь ( require('os').homedir()).

Онкл Том
источник
1
На моем компьютере с Windows 7 HOMEPATH и USERPROFILE возвращают одно и то же (C: \\ Users \\ Username). HOME возвращает неопределенное. На моем Mac HOME возвращает / Users / Имя пользователя и HOMEPATH и USERPROFILE возвращают undefined.
Бен Клейтон,
1
на моем компьютере с Windows 7 HOMEPATH возвращается \users\nameи USERPROFILE имеет c:\users\name. Так что этот метод не такой точный и надежный, как @maerics '
PA.
15

Использование osenv.home(). Он поддерживается isaacs, и я считаю, что используется самим npm.

https://github.com/isaacs/osenv

Эндрю Де Андраде
источник
1
oshomeиспользует os-homedirпод капотом, если вы хотите только эту функциональность.
spiffytech
0
getUserRootFolder() {
  return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
}
aH6y
источник