ব্যবহারকারীর হোম ডিরেক্টরি পান


94

নিম্নলিখিতটি কি চলমান ব্যবহারকারীর হোম ডিরেক্টরি পাওয়ার সবচেয়ে ভাল উপায়? বা আমি একটি নির্দিষ্ট ফাংশন আছে যা আমি উপেক্ষা করেছি?

os.Getenv("HOME")

যদি উপরেরটি সঠিক হয়, তবে কি কেউ জানতে পারে যে এই পদ্ধতির নন-লিনাক্স প্ল্যাটফর্মগুলি যেমন উইন্ডোজে কাজ করার গ্যারান্টিযুক্ত কিনা?


4
$HOMEব্যবহারকারীর হোম ডিরেক্টরি অগত্যা নয় । উদাহরণস্বরূপ, আমি export HOME=/something/elseআপনার প্রোগ্রামটি চালু করার আগে লিখতে পারি । সাধারণত এর অর্থ আমি চাই যে প্রোগ্রামটি /something/elseকোনও কারণে আমার হোম ডিরেক্টরি হিসাবে বিবেচিত হবে এবং সাধারণত প্রোগ্রামটি এটি গ্রহণ করা উচিত। তবে যদি আপনার সত্যিকারের ব্যবহারকারীর প্রকৃত হোম ডিরেক্টরিটি প্রয়োজন হয় তবে একটি পরিবেশের পরিবর্তনশীল আপনাকে তা দেবে না।
কিথ থম্পসন

4
@ কিথ থমসন ধন্যবাদ তবে আমার উদ্দেশ্যগুলির জন্য এটি যথেষ্ট ভাল।
পল রুয়ান

উত্তর:


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


4
দুর্দান্ত, অনেক ধন্যবাদ। এই পরিবর্তন সম্পর্কে অচেতন ছিল। আমি ঠিক এটিই খুঁজছিলাম।
পল রুউন

এটি কি কেবলমাত্র আমিই বা আমিই যেখানে উইন্ডোজে এটি করতে কয়েক সেকেন্ড সময় লাগে?
এইচটিবিএ

এটি অবশ্যই আমার উইন্ডোজ 7 64 বিট ভিএম তে তাত্ক্ষণিক মনে হয়।
ভ্লাদ ডিডেনকো

4
সচেতন থাকুন যে ১.১ এর হিসাবে, "ইউএসআর, এরর: = ইউজার: কর্নার ()" একটি "ব্যবহারকারী: নিক্ষিপ্ত হবে না ডারউইন / এএমডি os64 এ" প্রয়োগ করা হয়নি ত্রুটিতে ত্রুটি।
ওলিয়েড

11
ক্রস সংকলিত কোড. google.com/p/go/issues/detail?id=6376
বিষ্ণু

61

os.UserHomeDir ()

Go1.12 + এ আপনি ওএস ব্যবহার করতে পারেন serউসোমার হোমডির ()

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

4
এটি জেরেমি ডাব্লু শেরম্যানের মতো একই পদ্ধতি যা বর্তমানে একমাত্র উপায় বলে মনে হয়। অনেক ধন্যবাদ.
পল রুয়ান

4
এই পন্থাটি অনুসরণ করা হয়েছে ভাইপার ইউজ.গো ইউজার হোমডির ()
রুবেলগুনা

প্রায় সব ক্ষেত্রেই যেখানে আমি এটি ব্যবহার দেখতে পাচ্ছি, এটি করা সঠিক জিনিস নয়USERPROFILEসিস্টেমে ব্যবহারকারীর স্টোরেজ স্পেসের মূল, তবে এটি সেভ নয় যেখানে অ্যাপ্লিকেশনগুলি সেভ ডায়ালগ প্রম্পটের বাইরে লিখতে হবে। আপনার কাছে অ্যাপ্লিকেশন কনফিগারেশন থাকলে এটিতে লেখা উচিত APPDATAএবং আপনার কাছে অ্যাপ্লিকেশন ক্যাশে থাকলে (বা বড় ফাইলগুলি যা কোনও নেটওয়ার্কের সাথে সিঙ্ক করা উচিত নয়) এটি LOCALAPPDATAউইন্ডোতে লেখা উচিত written
মাইকা জোল্টু

4

এটি করার জন্য এখানে একটি দুর্দান্ত, সংক্ষিপ্ত উপায় (আপনি যদি কেবলমাত্র ইউএনআইএক্স ভিত্তিক সিস্টেমে চালিত হন):

import (
  "os"
)

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

এটি কেবল environment হোম এনভায়রনমেন্ট ভেরিয়েবলের অনুসন্ধান করে।

--- সম্পাদনা ---

আমি এখন দেখছি যে উপরে একই পদ্ধতিটি প্রস্তাবিত হয়েছিল। আমি এই উদাহরণটি এখানে একটি পাতনযুক্ত সমাধান হিসাবে রেখে দেব।


4
১. এটি আগে প্রস্তাবিত হয়েছিল, ২. এটি ক্রস প্ল্যাটফর্ম নয়, ৩. স্বীকৃত উত্তর ইতিমধ্যে এই সমস্যাটিকে আরও ভাল উপায়ে সমাধান করে।
পল রুনে

3

@ পেটারএসও এর অনুরূপ উত্তর তবে 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ডিফল্ট অ্যাপ্লিকেশন বিকাশকারীরা কর্পোরেট নেটওয়ার্কগুলি ভাঙছে না। 😊
মাইকা জোল্টু

2

আপনার পরিবেশের পরিবর্তনশীল USERPROFILEবা HOMEPATHউইন্ডোজ এর অধীনে ব্যবহার করা উচিত । দেখুন স্বীকৃত পরিবেশ ভেরিয়েবল (ক আরও এতত্সম্পর্কে ডকুমেন্টেশন লিংক স্বাগত হবে)।


ধন্যবাদ আপনি কি বলছেন, তবে যে হোম প্রতিটি প্ল্যাটফর্মের জন্য গো দ্বারা জনবহুল নয় (এটি সরাসরি ও / এস এনভি ভার্সে প্রতিনিধিত্ব করে) এবং হোম ডিরেক্টরিটি সনাক্ত করার জন্য আমাকে অবশ্যই প্রতিটি প্ল্যাটফর্মের সংশ্লিষ্ট ভেরিয়েবলটি পরীক্ষা করতে হবে?
পল রুয়ান 21 ই

আমি উত্সটি একবার দেখেছি এবং এটি প্রদর্শিত হয় হোম স্বয়ংক্রিয়ভাবে জনবহুল নয়। মনে হয় (বর্তমানে) হোম ডিরেক্টরি পাওয়ার জন্য কোনও প্ল্যাটফর্ম অজিনস্টিক সুবিধা নেই।
পল রুউন 21

@ পলরউইন যেহেতু প্ল্যাটফর্মগুলি বিভিন্ন ভেরিয়েবল ব্যবহার করে, কেবল ওএসকে উপেক্ষা করুন, উভয় ভেরিয়েবলগুলি পরীক্ষা করুন এবং যে কোনও জনবসতিযুক্ত তা নিয়ে যান। যদি উভয়ই সংজ্ঞায়িত হয় তবে আমি ব্যবহার করব HOME, যেহেতু সম্ভবত এটি আপনি সাইগুইনের অধীনে চলছে।
জেরেমি ডব্লিউ শেরম্যান

আপনি উচিত নয় ব্যবহার USERPROFILEবা HOMEPATHঅধিকাংশ ক্ষেত্রে উইন্ডোজ উপর। প্রায় সব ক্ষেত্রে যেখানে devs যারা ব্যবহার করে, যা তারা উচিত ব্যবহার করা হয় APPDATAবা LOCALAPPDATA(কিনা এটা লগইন / লগআউট করলে নেটওয়ার্কের মাধ্যমে সিঙ্ক করার বিষয়বস্তু জন্য যুক্তিযুক্ত উপর নির্ভর করে)।
মাইকা জোল্টু

2

go1.8rc2 এর গো / বিল্ড / ডিফল্ট GOPATH ফাংশন রয়েছে যা হোম ডিরেক্টরিটি পায়। https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277

নিম্নলিখিত কোডটি ডিফল্ট GOPATH ফাংশন থেকে নেওয়া হয়।

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

যদিও এই গো ফাংশনটির বাস্তবায়ন আকর্ষণীয়, স্বীকৃত উত্তরে বর্ণিত স্ট্যান্ডার্ড লাইব্রেরি ফাংশনটি ব্যবহার করার চেয়ে এটি আরও খারাপ সমাধান। (এবং ছয় বছর আগে থেকে পিটারএসওর উত্তর হিসাবে একই পন্থা))
পল রুনে

এটি বেশিরভাগ ক্ষেত্রে সঠিক সমাধান নয় । অন্যান্য উত্তরের মন্তব্য দেখুন, তবে টিএল; ডিআর হ'ল APPDATAবাLOCALAPPDATA ডান পছন্দ না প্রায় সবসময় হয় USERPROFILE, Windows এ।
মাইকা জোল্টু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.