Node.js - Znajdź katalog domowy w sposób agnostyczny na platformie

214

Process.platform zwraca „win32” dla Windows. W systemie Windows katalogiem domowym użytkownika może być C: \ Users [NAZWA UŻYTKOWNIKA] lub C: \ Documents and Settings [NAZWA UŻYTKOWNIKA], w zależności od używanej wersji systemu Windows. W Uniksie to nie jest problem.

Mateusz
źródło
Czy Mac OS X zachowuje metodę uniksową, czy też wymaga czegoś innego?
hippietrail,
2
@hippietrail Mac OS X używa HOME tak jak każdy inny Uniks.
Marnen Laibow-Koser

Odpowiedzi:

330

Jak wspomniano w nowszej odpowiedzi , preferowanym sposobem jest teraz:

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

[Oryginalna odpowiedź] : dlaczego nie użyć USERPROFILEzmiennej środowiskowej w win32?

function getUserHome() {
  return process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'];
}
maerika
źródło
Dziękuję Ci. Właśnie zainstalowałem Node.js lokalnie, ponieważ budowanie podstawowego serwera na Cloud9 nie jest zgodne z moim małym samouczkiem (oczywiście) ... i nie miałem POMYSŁU, gdzie umieścić moje pliki. Jesteś meżczyzną! (Zakładam)
Steve,
W wersji 0.10.33 wygrywa 64-bit, to nie działa. Mam USERPROFILE i HOME ustawione na C: Moja firma zmusza mnie do ustawienia HOMEDRIVE / HOMEPATH na udział sieciowy H :. Z jakiegoś powodu węzeł woli H :.
Angus,
9
Mam zdecydowanie negatywną reakcję na tę i drugą najpopularniejszą odpowiedź. Jeśli używasz node.js, to IMHO, powinieneś faworyzować moduły npm, takie jak os.homedir () i osenv.home () (oba wymienione poniżej). Jeśli spojrzysz na źródło os.homedir (), zobaczysz, że nie jest to takie proste.
Larry Maccherone
To nie jest platforma agnostyczna.
Michael
owijanie path.resolve()może zapewnić pewną normalizację pod względem ukośników końcowych, potencjalnie nieparzystych ukośników do przodu / do tyłu itp. (zwłaszcza jeśli masz na myśli operacje na plikach, po otrzymaniu tych informacji)
Frank Nocke
237

os.homedir()został dodany przez ten PR i jest częścią publicznej wersji 4.0.0 nodejs.


Przykładowe użycie:

const os = require('os');

console.log(os.homedir());
Cody Allan Taylor
źródło
Witamy w Stack Overflow! Podaj swoją odpowiedź jako odpowiedź , a nie pytanie.
durron597,
2
Rozumiem. Dodano źródła, ponieważ os.homedir()jest to całkiem nowa, cholerna zabawka.
Cody Allan Taylor,
8
należy przyjąć odpowiedź, ponieważ jest kompatybilna na różnych platformach
Yahya Uddin
2
Trzeba const os = require('os');też dodać
Roel
81

Cóż, bardziej dokładne byłoby poleganie na funkcji, a nie na wartości zmiennej. Zwłaszcza, że ​​istnieją 2 możliwe zmienne dla systemu Windows.

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

EDYCJA : jak wspomniano w nowszej odpowiedzi, https://stackoverflow.com/a/32556337/103396 jest właściwą drogą do przejścia ( require('os').homedir()).

Oncle Tom
źródło
1
Na moim komputerze z systemem Windows 7 HOMEPATH i USERPROFILE zwracają to samo (C: \\ Users \\ Nazwa użytkownika). HOME zwraca wartość niezdefiniowaną. Na moim komputerze Mac HOME zwroty / Użytkownicy / Nazwa użytkownika oraz HOMEPATH i USERPROFILE zwracają wartość niezdefiniowaną.
Ben Clayton
1
na mojej maszynie z Windows 7 HOMEPATH powraca, \users\namea USERPROFILE ma c:\users\name. Ta metoda nie jest tak dokładna i niezawodna jak @maerics '
PA.
15

Posługiwać się osenv.home() . Jest utrzymywany przez isaacs i myślę, że jest używany przez sam npm.

https://github.com/isaacs/osenv

Andrew De Andrade
źródło
1
oshomeużywa os-homedirpod maską, jeśli chcesz tylko tę funkcjonalność.
spiffytech,
0
getUserRootFolder() {
  return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
}
aH6y
źródło