% # AppData% का पथ प्राप्त करना


387

C # 2008 SP1

मैं नीचे दिए गए कोड का उपयोग कर रहा हूं:

dt.ReadXml("%AppData%\\DateLinks.xml");

हालाँकि, मुझे एक अपवाद मिल रहा है जो उस स्थान की ओर इशारा करता है जहाँ से मेरा आवेदन चल रहा है:

पथ का एक भाग नहीं ढूँढ सका 'D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml'।

मुझे लगा कि %AppData%रिश्तेदार रास्ता खोजना चाहिए। जब मैं Start|Run|%AppData%विंडोज़ पर जाता हूं तो खोजकर्ता मुझे उस निर्देशिका में ले जाता है।

मैं पूरा रास्ता नहीं रख सकता, क्योंकि उपयोगकर्ता प्रत्येक ग्राहक मशीन पर अलग है।

जवाबों:


802

AppData निर्देशिका प्राप्त करने के लिए, GetFolderPathविधि का उपयोग करना सबसे अच्छा है :

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

( using Systemवर्तमान में नहीं होने पर जोड़ना चाहिए )।

%AppData%एक पर्यावरण चर है, और वे .NET में कहीं भी स्वचालित रूप से विस्तारित नहीं होते हैं, हालांकि आप स्पष्ट रूप Environment.ExpandEnvironmentVariableसे ऐसा करने के लिए विधि का उपयोग कर सकते हैं । मैं फिर भी दृढ़ता से सुझाव दूंगा कि आप GetFolderPathहालांकि उपयोग करें , क्योंकि जोहान्स रोसेल टिप्पणी में बताते हैं, %AppData%कुछ परिस्थितियों में सेट नहीं किया जा सकता है।

अंत में, अपने उदाहरण में दिखाए अनुसार पथ बनाने के लिए:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

45
एक वास्तविक समाधान की पेशकश के लिए +1, पर्यावरण पर निर्भर नहीं। उत्तर में जोड़ने के लिए: फ़ाइल नाम को संभालने वाला प्रत्येक फ़ंक्शन पर्यावरण चर का विस्तार नहीं करता है। वास्तव में, आमतौर पर आपको स्पष्ट रूप से ऐसा करना पड़ता है, अन्यथा यह काम नहीं करता है और आप कुछ%% फ़ोल्डर के साथ समाप्त हो जाएंगे। इसके अलावा, पर्यावरण को प्रस्तुत करने की आवश्यकता नहीं है, कुछ मामलों में जब किसी अन्य उपयोगकर्ता खाते के तहत एक कार्यक्रम चल रहा है तो उपयोगकर्ता का पर्यावरण लोड नहीं होगा और% Appdata% खाली हो जाएगा। इसलिए आप उन फ़ोल्डरों को प्राप्त करने के लिए प्रलेखित एपीआई का उपयोग करना चाहते हैं (जब तक कि आप बैच फ़ाइलों का उपयोग नहीं कर रहे हैं, हालांकि)।
जॉय

@ जोहान्स: वहाँ अच्छी जानकारी। जैसे ही आपने पोस्ट किया, मैंने अपने उत्तर में संशोधन कर दिया, लेकिन मैं यह स्पष्ट कर दूंगा कि GetFolderPath निश्चित रूप से ExpandEnvironmentVariable पर बेहतर है।
नोल्डोरिन

+1 पर्यावरण के लिए। GetFolderPath (Environment.pecialFolder.ApplicationData), मैं अब कुछ दिनों के लिए इसके पीछे था।
सुमित घोष

1
किसी कारण से Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)मेरे लिए (स्ट्रिंग 7, वीएस 2011) खाली स्ट्रिंग देता है। साइमन_वेवर समाधान का उपयोग करके समस्या हल की गई - उपयोग करके मैपिंग MapPath
माइक केसिनकोव

52
FYI करें जो स्थानीय AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData) के लिए रोमिंग निर्देशिका प्रदान करता है
राउंडक्रिसिस

49

यदि आप ASP.NET से बात कर रहे हैं तो रास्ता अलग है।

मुझे ASP.NET के लिए / App_Data की ओर इशारा करते हुए कोई भी 'विशेष फ़ोल्डर' मान नहीं मिला।

इसके बजाय आपको ऐसा करने की आवश्यकता है:

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(नोट: आपको MVC नियंत्रक में 'वर्तमान' संपत्ति की आवश्यकता नहीं है)

अगर एक और अधिक 'सार' पाने के लिए App_Dataकैसे सुनने के लिए प्यार होता है।


Asp.net कोर के बाद से अभी एक नोट बाहर आ रहा है। यह दृष्टिकोण विशेष रूप से IIS पर निर्भर करता है।
जॉर्ज मौअर

7
HostingEnvironment.MapPath(@"~/App_Data")बेहतर है और MVC / WebAPI और WCF दोनों संदर्भों में काम करता है जहां कोई HttpContext नहीं है - लेकिन कोर के बारे में निश्चित नहीं है '
Simon_Weaver

36

AppData निर्देशिका का उपयोग करने का सबसे अच्छा तरीका है, विधि का उपयोग करने के लिए ISEnvironment.ExpandEnvironmentVariable

कारण:

  • यह आपके स्ट्रिंग के हिस्सों को मान्य निर्देशिकाओं या जो भी हो, के साथ बदल देता है
  • यह मामला असंवेदनशील है
  • यह आसान और सरल है
  • यह एक मानक है
  • उपयोगकर्ता इनपुट से निपटने के लिए अच्छा है

उदाहरण:

string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

कुछ उपयोगकर्ताओं को याद रखें %AppData%, कुछ %appdata%और कुछ जिन्हें %APpData% आप समाप्त नहीं करना चाहते हैं:

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

यदि पर्यावरण चर सेट नहीं है, तो यह आपकी गलती नहीं है (इसके अलावा जब आईएस है )। मैं आमतौर पर लोगों को पहिया का फिर से आविष्कार नहीं करने के लिए नहीं कहता , लेकिन जब मैंने पहली बार दूसरे रास्ते पर चला गया और महसूस किया कि यह एक बुरा विचार था।


pathचर के अपने उदाहरण पसंद किए गए :)
RBT

+1 Environment.ExpandEnvironmentVariableसबसे अच्छा है जब आपको केवल इस बात की परवाह किए बगैर विस्तार करने की आवश्यकता होती है कि रास्ते में स्ट्रिंग में कौन-से एनवी संस्करण हो सकते हैं।
फफोले

24

आप भी उपयोग कर सकते हैं

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

%AppData%चर का विस्तार करने के लिए ।


15

.Net2.0 में आप वैरिएबल का उपयोग कर सकते हैं Application.UserAppDataPath


20
यह केवल Winforms है।

7

मुझे नहीं लगता कि इस तरह काम करने में% AppData% को एक स्ट्रिंग में रखा जाएगा।

प्रयत्न

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

4

केवल इस मामले में मेरे mvc एप्लिकेशन में 'App_Data' फ़ोल्डर तक पहुँचने का एक और तरीका साझा करना चाहता था कि किसी को इसकी आवश्यकता हो।

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")

शायद सही उत्तर न हो, लेकिन यह वही है जो मैं खोज रहा था। +1
डेरिक

डबल कोट्स के साथ सिंगल कोट्स की जगह लेने के बाद मेरे लिए काम किया। Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d

1

यह मेरे लिए कंसोल एप्लिकेशन में काम कर रहा है -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

ASP.NET के लिए, Load User Profileसेटिंग को ऐप पूल पर सेट करना होगा लेकिन यह पर्याप्त नहीं है। नाम setProfileEnvironmentमें एक छिपी हुई सेटिंग है \Windows\System32\inetsrv\Config\applicationHost.config, जो किसी कारण से डिफ़ॉल्ट रूप से बंद कर दी जाती है, इसके बजाय प्रलेखन में वर्णित है । आप या तो डिफ़ॉल्ट को बदल सकते हैं या इसे अपने ऐप पूल पर सेट कर सकते हैं। Environmentकक्षा पर सभी विधियाँ फिर उचित मान लौटाएंगी।

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