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.