C # में होम डायरेक्टरी की राह पा रहे हैं?


101

ठीक है, मैंने Environment.SpecialFolder को चेक किया है, लेकिन इसके लिए वहां कुछ भी नहीं है।

मैं C # में वर्तमान उपयोगकर्ता की होम निर्देशिका प्राप्त करना चाहता हूं। (उदाहरण c:\documents and settings\userके लिए XP के तहत, c:\users\userविस्टा के तहत, और /home/userयूनिक्स के तहत।)

मुझे पता है कि मैं यह पता लगाने के लिए पर्यावरण चर पढ़ सकता हूं, लेकिन मैं इसे क्रॉस-प्लेटफॉर्म तरीके से करना चाहता हूं।

क्या कोई ऐसा तरीका है जो मैं .NET (अधिमानतः mscorlib का उपयोग करके) के साथ कर सकता हूं?

अद्यतन : ठीक है, यह वह कोड है जिसका उपयोग करके मैंने समाप्त किया:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
                   Environment.OSVersion.Platform == PlatformID.MacOSX)
    ? Environment.GetEnvironmentVariable("HOME")
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");

2
बूम। पश्चिम में सबसे तेज़ बंदूक: पी
बोरिस

आपकी मशीन के बारे में पता नहीं है, लेकिन मेरे XP बॉक्स पर% HOMEDRIVE %% HOMEPATH% एक नेटवर्क निर्देशिका है, न कि c: \ Documents and Settings \ user \ MSalters \
MSalters

ईमानदार होने के लिए, मैं इस सटीक समस्या को .NET का एक महत्वपूर्ण कार्यान्वयन मानता हूं ... आपको पूर्ण सूची देखने के लिए CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ) के दस्तावेज़ देखना चाहिए । Windows किसका समर्थन करता है: आप वास्तव में क्या देख रहे हैं CSIDL_PROFILE, जो विंडोज में समर्थित है, लेकिन कुछ अयोग्य कारण के लिए .NET द्वारा नहीं।
मैथ्यू शेर्ले

1
मुझे लगता है कि आपको अगली बार, एक उत्तर में परिणाम डालना चाहिए।
पेटीएम

PlatformID.MacOSX आवश्यक नहीं है, PlatformID.Unix MacOSX पर भी सही है, या (बहुत कम से कम इसका उपयोग करने के लिए)।
स्टीफन स्टीगर

जवाबों:


51

Environment.SpecialFolder.Personalवास्तव में होम फोल्डर वापस नहीं करता है, यह माई डॉक्यूमेंट्स फोल्डर को लौटाता है । Win32 पर होम फोल्डर प्राप्त करने का सबसे सुरक्षित तरीका पढ़ना है %HOMEDRIVE%%HOMEPATH%। पर्यावरण चर पढ़ना वास्तव में करने के लिए (यूनिक्स और विंडोज के पार) बहुत पोर्टेबल है, इसलिए मुझे यकीन नहीं है कि पोस्टर ऐसा क्यों नहीं करना चाहता था ।

जोड़ने के लिए संपादित: crossplatform (विंडोज / यूनिक्स) C # के लिए, मैं $HOMEयूनिक्स और OSX और %HOMEDRIVE%%HOMEPATH%विंडोज पर पढ़ूंगा।


मैं जानता हूँ कि एक तथ्य के लिए HOMEDRIVE * nix पर मौजूद नहीं है, और आम तौर पर यह सिर्फ घर है, HOMEPATH नहीं।
मैथ्यू शेर्ले

मैथ्यू, तुम सही हो। मैंने मूल टिप्पणी पर एक स्पष्टीकरण जोड़ा।
सिगंट

12
क्या आप विंडोज पर% USERPROFILE% का उपयोग नहीं कर सकते हैं?
लुकास जोन्स

1
$ HOME OS X पर भी काम करता है। यह अभी भी सही उत्तर नहीं है जहां तक ​​मेरा संबंध है क्योंकि आप प्लेटफ़ॉर्म डिटेक्शन कर रहे हैं ... लेकिन इसके लिए पूछे गए सटीक मानों को प्राप्त करने के लिए, जो आपको करना है।
मैथ्यू शार्ले

2
व्यक्ति-बी,% USERPROFILE% और% HOMEDRIVE %% HOMEPATH% अक्सर व्यक्तिगत पीसी पर समान होते हैं, लेकिन अक्सर नेटवर्क वाले वातावरण में अलग-अलग स्थानों पर इंगित होते हैं। उदाहरण के लिए, मेरे USERPROFILE पर C: \ Documents and Settings \ username है, लेकिन होम डायरेक्टरी Z: \ है, जो एक नेटवर्क ड्राइव है जो नियमित रूप से IT द्वारा समर्थित है।
सिगंट

92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

व्यक्तिगत मेरे दस्तावेज़ (या win7 और इसके बाद के संस्करण में दस्तावेज़) हैं।


8
ध्यान दें कि UserProfile .NET 4.0 में नया है, यदि आप .NET 2.0 / 3.5 का उपयोग करते हैं, तो आपको Win32 API को मैन्युअल रूप से UserProfile के लिए 40 मान के साथ कॉल करना होगा
linquize करें

और विंडोज 95, 98 और एमई को छोड़कर "माई डॉक्यूमेंट्स" होम डायरेक्टरी के समान नहीं है।
जॉन हन्ना

1
अपनी फ़ाइल पथ को पोर्टेबल रखने के लिए System.IO.Path.DirectorySeparatorChar का उपयोग करना न भूलें।
13

4
DirectorySperatorChar का उपयोग मैन्युअल रूप से न करें। Path.Combine का उपयोग करें।
जॉन गिएटजेन

14

मेरा मानना ​​है कि आप जो खोज रहे हैं वह है:

System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)

संदर्भ के लिए, यह में निहित है mscorlib


यह मेरा दस्तावेज़ फ़ोल्डर लौटाता है।
MiffTheFox

"मेरे दस्तावेज़" है निकटतम बात विंडोज एक घर निर्देशिका करने के लिए है।
MSALERS

8
@MStallers नहीं,% HOMEDRIVE %% HOMEPATH% है।
MiffTheFox

काफी नहीं ... लेकिन विकल्प PInvoke है, और ओपी ने एक प्रबंधित समाधान के लिए कहा।
मैथ्यू शार्ले

7
ध्यान दें कि Environment.SpecialFolder.UserProfile .NET 4.0 में उपलब्ध है, जो कि आप चाहते हैं
linquize करें

8

DotNetCore में 1.1 System.Environment.SpecialFolderमौजूद नहीं है। यह 2.0-बीटा में मौजूद हो सकता है। तब तक, ऐसा करने के लिए आप निम्नलिखित का उपयोग कर सकते हैं:

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`

मैं 2.0 का उपयोग कर रहा हूँ और System.Environment.SpecialFolderमौजूद है
snotyak

4

नीचे पंक्ति का उत्तर है। घर निर्देशिका प्राप्त करने के लिए .NET में कोई सरल प्रणाली आधारित विधि नहीं है, जिससे हम विंडोज़ पर और मोनो में .NET दोनों में कार्यान्वयन की उम्मीद कर सकते हैं।

आपको ओएस विशिष्ट कोड के लिए कुछ ओएस का पता लगाने और शाखा करने की आवश्यकता होगी।


1

जब आप क्रॉस-प्लेटफ़ॉर्म तरीके से कहते हैं, तो आपको किन अन्य ओएस का समर्थन करने की आवश्यकता है? यदि आप गैर-विंडोज ओएस पर चल रहे हैं, तो घर की निर्देशिका खोजने के लिए विधि का चयन करने के लिए आपको कुछ सरल ओएस का पता लगाने की आवश्यकता हो सकती है।

यह वेबसाइट आपको विंडोज में जो कुछ भी करने की आवश्यकता है उसे करने का एक तरीका देती है।


जब तक आप फ्रेमवर्क एनवायरनमेंट के कुछ ब्रिंडेड कार्यान्वयन का उपयोग नहीं कर रहे हैं। GetFolder () को क्रॉस-प्लेटफॉर्म पर काम करना चाहिए।
आर। मार्टिनो फर्नांडिस

2
चाहिए । MS का कार्यान्वयन ऐसा नहीं करता है।
आर। मार्टिनो फर्नांडिस

1

यह प्रयोग किया जा सकता GetEnvironmentVariableमें System.IO:

public string GetUserHome() {
    var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE");
    if (!string.IsNullOrWhiteSpace(homeDrive))
    {
        var homePath = Environment.GetEnvironmentVariable("HOMEPATH");
        if (!string.IsNullOrWhiteSpace(homePath))
        {            
            var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath;
            return Path.Combine(fullHomePath, "myFolder");
        }
        else
        {
            throw new Exception("Environment variable error, there is no 'HOMEPATH'");
        }
    }
    else
    {
        throw new Exception("Environment variable error, there is no 'HOMEDRIVE'");
    }
}

फिर यह विंडोज़ के तहत उत्पादन करता है: C:\\\\Users\\myusername\\myFolder

ध्यान दें कि यदि आप उपयोग करते हैं

var fullHomePath = Path.Combine(homeDrive.ToString(), homePath.ToString())

यह विफल रहता है क्योंकि यह उत्पादन करता है: \\Users\\myusername\\myFolder


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.