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.


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'];
}

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());

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()).


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.


0
getUserRootFolder() {
  return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.