web-dev-qa-db-fra.com

Obtenir le répertoire personnel de l'utilisateur

Les éléments suivants constituent-ils le meilleur moyen d'obtenir le répertoire de base de l'utilisateur en cours d'exécution? Ou y a-t-il une fonction spécifique que j'ai trop recherchée?

os.Getenv("HOME")

Si ce qui précède est correct, quelqu'un sait-il si cette approche est garantie de fonctionner sur des plates-formes non Linux, par exemple Les fenêtres?

78
Paul Ruane

Dans go 1.0.3 (probablement plus tôt aussi), les travaux suivants:

package main
import (
    "os/user"
    "fmt"
    "log"
)
func main() {
    usr, err := user.Current()
    if err != nil {
        log.Fatal( err )
    }
    fmt.Println( usr.HomeDir )
}

S'il est important d'effectuer une compilation croisée, considérez la bibliothèque homedir

156
Vlad Didenko

Par exemple,

package main

import (
    "fmt"
    "os"
    "runtime"
)

func UserHomeDir() string {
    if runtime.GOOS == "windows" {
        home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
        if home == "" {
            home = os.Getenv("USERPROFILE")
        }
        return home
    }
    return os.Getenv("HOME")
}

func main() {
    dir := UserHomeDir()
    fmt.Println(dir)
}
19
peterSO

os.UserHomeDir ()

Dans go1.12 +, vous pouvez utiliser os.UserHomeDir ()

home, err := os.UserHomeDir()

Voir https://golang.org/pkg/os/#UserHomeDir

Cela devrait fonctionner même sans CGO activé (c'est-à-dire FROM scratch) et sans avoir à analyser /etc/passwd ou tout autre non-sens.

16
CoolAJ86

Voici une manière agréable et concise de le faire (si vous ne travaillez que sur un système UNIX):

import (
  "os"
)

var home string = os.Getenv("HOME")

Cela interroge simplement la variable d'environnement $ HOME.

--- Modifier ---

Je vois maintenant que cette même méthode a été suggérée ci-dessus. Je vais laisser cet exemple ici comme une solution distillée.

4
Murphy Randle

Réponse similaire à @peterSO mais respecte le XDG_CONFIG_HOME chemin pour linux.

package main

import (
    "fmt"
    "os"
    "runtime"
)

func userHomeDir() string {
    if runtime.GOOS == "windows" {
        home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
        if home == "" {
            home = os.Getenv("USERPROFILE")
        }
        return home
    } else if runtime.GOOS == "linux" {
        home := os.Getenv("XDG_CONFIG_HOME")
        if home != "" {
            return home
        }
    }
    return os.Getenv("HOME")
}

func main() {
    fmt.Println(userHomeDir())
}
2
Miguel Mota

go1.8rc2 a la fonction go/build/defaultGOPATH qui obtient le répertoire personnel. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277

Le code suivant est extrait de la fonction defaultGOPATH.

package main

import (
    "fmt"
    "os"
    "runtime"
)

func UserHomeDir() string {
    env := "HOME"
    if runtime.GOOS == "windows" {
        env = "USERPROFILE"
    } else if runtime.GOOS == "plan9" {
        env = "home"
    }
    return os.Getenv(env)
}

func main() {
    dir := UserHomeDir()
    fmt.Println(dir)
}
2
hnakamur

Vous devez utiliser la variable d'environnement USERPROFILE ou HOMEPATH sous Windows. Voir Variables d'environnement reconnues (un lien de documentation plus approprié serait le bienvenu).

2
Jeremy W. Sherman