उपयोगकर्ता के घर निर्देशिका प्राप्त करें


92

निम्नलिखित उपयोगकर्ता के घर निर्देशिका प्राप्त करने का सबसे अच्छा तरीका है? या क्या कोई विशिष्ट कार्य है जिसे मैंने अनदेखा किया है?

os.Getenv("HOME")

यदि उपरोक्त सही है, तो क्या किसी को पता है कि क्या यह दृष्टिकोण गैर-लिनक्स प्लेटफार्मों, जैसे विंडोज पर काम करने की गारंटी है?


2
$HOMEजरूरी नहीं कि उपयोगकर्ता होम डायरेक्टरी हो। उदाहरण के लिए, मैं export HOME=/something/elseआपका कार्यक्रम शुरू करने से पहले लिख सकता हूं । आमतौर पर इसका मतलब है कि मैं चाहता हूं कि कार्यक्रम /something/elseकिसी कारण से मेरी घरेलू निर्देशिका के रूप में माना जाए , और आमतौर पर कार्यक्रम को यह स्वीकार करना चाहिए। लेकिन अगर आपको वास्तव में उपयोगकर्ता की वास्तविक होम निर्देशिका की आवश्यकता है, तो एक पर्यावरण चर आपको जरूरी नहीं देगा।
कीथ थॉम्पसन

1
@KeithThompson धन्यवाद, लेकिन मेरे उद्देश्यों के लिए यह काफी अच्छा है।
11:33

जवाबों:


175

1.0.3 में (शायद पहले भी,) निम्नलिखित काम करता है:

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

यदि क्रॉस-कंपाइल करना महत्वपूर्ण है, तो लाइब्रेरी पर विचार करेंhomedir


1
बहुत बढ़िया, बहुत धन्यवाद। इस बदलाव से अनजान थे। यही वह है जिसकी तलाश में मैं हूं।
पॉल रूआन

क्या यह सिर्फ मैं हूं या मैं अकेला हूं जहां विंडोज पर ऐसा करने में कई सेकंड लगते हैं?
हटबा

यह निश्चित रूप से मेरे विंडोज 7 64 बिट वीएम पर तुरंत लगता है।
व्लाद डिडेंको

4
ज्ञात हो कि 1.1 के रूप में, "usr, इरेट: = user.Current ()" एक "उपयोगकर्ता: वर्तमान में लागू नहीं किया जाएगा darswin / amd64" osx पर त्रुटि।
ओलियेड जुले

11
जब संकलित कोड पार नहीं होता है तो। com /google.com/p/go/issues/detail?id=6376
विष्णु

59

os.UserHomeDir ()

Go1.12 + में आप os.UserHomeDir () का उपयोग कर सकते हैं

home, err := os.UserHomeDir()

Https://golang.org/pkg/os/#UserHomeDir देखें

सीजीओ सक्षम (यानी FROM scratch) के बिना भी काम करना चाहिए और बिना /etc/passwdइस तरह के बकवास या अन्य बकवास करना चाहिए।


23

उदाहरण के लिए,

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)
}

1
यह जेरेमी डब्ल्यू शेरमैन के समान दृष्टिकोण है जो वर्तमान में एकमात्र तरीका प्रतीत होता है। बहुत धन्यवाद।
पॉल रूआन

2
यह वाइपर यूज़ में पीछा किया गया दृष्टिकोण है। यूजरहोमडिर ()
रुबेनलागुना

लगभग सभी मामलों में जहां मैं इस प्रयोग किया जाता है देखने के रूप में, यह है नहीं करना सही बात। USERPROFILEसिस्टम पर उपयोगकर्ता के स्टोरेज स्पेस की जड़ है, लेकिन यह वह जगह नहीं है जहां एप्लिकेशन को एक डायलॉग प्रॉम्प्ट के बाहर लिखना चाहिए। यदि आपके पास एप्लिकेशन कॉन्फ़िगरेशन है, तो इसे लिखा जाना चाहिए APPDATAऔर यदि आपके पास एप्लिकेशन कैश है (या बड़ी फाइलें जो किसी नेटवर्क पर सिंक नहीं होनी चाहिए) तो इसे LOCALAPPDATAविंडोज पर लिखा जाना चाहिए ।
मीका झोल्टू

4

यह करने के लिए एक अच्छा, संक्षिप्त तरीका है (यदि आप केवल यूनिक्स आधारित प्रणाली पर चल रहे हैं):

import (
  "os"
)

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

यह सिर्फ $ HOME पर्यावरण चर पर सवाल उठाता है।

--- संपादित करें ---

अब मैं देख रहा हूं कि यही विधि ऊपर सुझाई गई थी। मैं इस उदाहरण को एक आसुत समाधान के रूप में यहाँ छोड़ दूँगा।


2
1. यह पहले सुझाव दिया गया है, 2. यह क्रॉस-प्लेटफॉर्म नहीं है, 3. स्वीकृत जवाब पहले से ही इस समस्या को बेहतर तरीके से हल करता है।
पॉल रूआन

3

@PeterSO को भी इसी तरह का उत्तर दिया गया है, लेकिन XDG_CONFIG_HOMEलिनक्स के लिए मार्ग का सम्मान करता है ।

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

विंडोज को सम्मान देने के लिए अपडेट किए गए इस उत्तर को देखना पसंद करेंगे! APPDATAकॉन्फ़िगरेशन के लिए और LOCALAPPDATAबड़ी फ़ाइलों के लिए। एक सामान्य उद्देश्य के लिए "घर" मैं सलाह देता हूं LOCALAPPDATAकि डिफ़ॉल्ट एप्लिकेशन डेवलपर्स कॉर्पोरेट नेटवर्क को बर्बाद नहीं कर रहे हैं। 😊
मीका Zoltu

2

आपको पर्यावरण चर USERPROFILEया HOMEPATHविंडोज के तहत उपयोग करना चाहिए । देखें मान्यता प्राप्त पर्यावरण चर (एक और अधिक अनुरूप दस्तावेज़ीकरण लिंक का स्वागत किया जाएगा)।


धन्यवाद। क्या आप यह कह रहे हैं कि, होम प्रत्येक प्लेटफॉर्म के लिए गो से पॉप्युलेट नहीं किया गया है (यह सीधे O / S env vars में डेलिगेट करता है) और मुझे होम डायरेक्टरी की पहचान करने के लिए प्रत्येक प्लेटफॉर्म के संबंधित वेरिएबल की जांच करनी चाहिए?
पॉल रूआन

मुझे स्रोत पर एक नज़र है और ऐसा प्रतीत होता है कि गृह स्वचालित रूप से आबाद नहीं है। लगता है कि (वर्तमान में) घर निर्देशिका प्राप्त करने के लिए कोई मंच अज्ञेयवादी सुविधा नहीं है।
पॉल रूआन

@PaRRuane चूंकि प्लेटफ़ॉर्म विभिन्न चर का उपयोग करते हैं, बस OS को अनदेखा करें, दोनों चर की जाँच करें, और जो भी आबादी है उसके साथ जाएं। यदि दोनों को परिभाषित किया जाता है, तो मैं उपयोग करूंगा HOME, क्योंकि इसका मतलब है कि आप साइबरविन के तहत चल रहे हैं।
जेरेमी डब्ल्यू। शेरमैन

आपको अधिकांश मामलों में विंडोज़ पर या विंडोज पर उपयोग नहीं करना चाहिए । लगभग सभी मामलों में जहां देवता उन का उपयोग करते हैं, उनका उपयोग क्या होना चाहिए या (यह निर्भर करता है कि लॉगिन / लॉगआउट पर नेटवर्क पर सिंक करने के लिए सामग्री के लिए यह उचित है)। USERPROFILEHOMEPATHAPPDATALOCALAPPDATA
मीका झोल्टू

2

go1.8rc2 में गो / बिल्ड / डिफॉल्ट GOPATH फ़ंक्शन है जिसे होम डायरेक्टरी मिलती है। https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277

निम्नलिखित कोड 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)
}

जब भी इस Go फ़ंक्शन का कार्यान्वयन दिलचस्प है, यह स्वीकृत उत्तर में वर्णित मानक लाइब्रेरी फ़ंक्शन का उपयोग करने से भी बदतर समाधान है। (और छह साल पहले के पेट्रोएस के जवाब के समान दृष्टिकोण है।)
पॉल रूआन

यह ज्यादातर मामलों में सही समाधान नहीं है । अन्य उत्तरों पर टिप्पणियाँ देखें, लेकिन TL, DR वह है APPDATAया LOCALAPPDATAलगभग हमेशा सही विकल्प है, USERPROFILEविंडोज पर नहीं ।
मीका झोलटू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.