ClickOnce एप्लिकेशन के लिए फ़ोल्डर पथ कैसे प्राप्त करें


160

मुझे उसी फ़ोल्डर में एक फ़ाइल लिखने की ज़रूरत है जहां एक कंसोल ClickOnce .application(निष्पादन योग्य फ़ाइल) रहता है। वह फ़ोल्डर जहाँ से इसे लॉन्च किया जाता है।

मैं का उपयोग करने की कोशिश की Application.StartupPathऔर Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) पथ के तहत एक सबफ़ोल्डर को इंगित कर रहा है c:\Documents & Settings। मैं उस मार्ग को कैसे प्राप्त करूं, जहां .applicationनिवास करता है?

जवाबों:


253

फ़ोल्डर स्थान खोजने के लिए, आप बस ऐप चला सकते हैं, कार्य प्रबंधक (CTRL-SHIFT-ESC) खोलें, ऐप चुनें और राइट-क्लिक करें | फ़ाइल स्थान खोलें।


3
हे, समर्थक टिप! लेकिन यह पुराने गंदे XP मशीनों पर उपलब्ध नहीं है। :)
जलाल

5
@ पुराने "गंदे मशीनों" के लिए जलाल www.SysInternals.com पर जाएं और प्रोसेस एक्सप्लोरर डाउनलोड करें। मुझे Win7 के टास्कमैनर में बदलाव पर संदेह है और फिर Win8 को सिर्फ इससे कॉपी किया गया।
एरच 'द

1
ग्राहक के कंप्यूटर पर चल रहे अपने एप्लिकेशन में आप इसे कैसे प्राप्त करते हैं?
user3285954

2
क्या होगा अगर मैं एप्लिकेशन नहीं चला सकता क्योंकि यह एक लॉग फ़ाइल को हटा देगा जिसकी मुझे सख्त आवश्यकता है?
टॉम ज़ातो -

2
@Tony_Hrich आप इसे सही उत्तर के रूप में चिह्नित करना चाहते हैं
स्पार्कशीट्स

120

पथ c: \ Documents & Settings के तहत एक सबफ़ोल्डर को इंगित कर रहा है

ये सही है। ClickOnce applicationsउस उपयोगकर्ता के प्रोफ़ाइल के नीचे स्थापित हैं जिन्होंने उन्हें स्थापित किया है। क्या आपने वह रास्ता निकाला जो निष्पादित विधानसभा से जानकारी को पुनः प्राप्त करता है, और आपको इसकी जांच करनी चाहिए?

विस्टा और विंडोज 7 पर, आपको यहां क्लिकऑन कैश मिलेगा:

c:\users\username\AppData\Local\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

विंडोज एक्सपी पर, आप इसे यहां पाएंगे:

C:\Documents and Settings\username\LocalSettings\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

1
मैं यह सब समझता हूं। मुझे वह फ़ोल्डर चाहिए जहां से मैंने एप्लिकेशन पर क्लिक किया था। मेरे पास C: \ Documents और Settings तक पहुंच नहीं है इसलिए मुझे लॉग फ़ाइल तक पहुंच नहीं होगी अगर मैं उस फ़ंक्शन द्वारा दिए गए फ़ोल्डर पथ का उपयोग करने जा रहा हूं और मैं हार्ड कोडित पथ मानों का उपयोग नहीं करना चाहता हूं ।
टोनी_ हेनरिक

25

ApplicationDeployment.CurrentDeployment.ActivationUri काम कर सकता है

"जीरो-लेंथ स्ट्रिंग यदि तैनाती मेनुफेक्चर में ट्रस्टयूएलपैरमेटर्स गुण गलत है, या यदि उपयोगकर्ता ने तैनाती को खोलने के लिए यूएनसी को आपूर्ति की है या इसे स्थानीय रूप से खोला है। अन्यथा, रिटर्न वैल्यू पूर्ण URL है जो एप्लिकेशन को लॉन्च करने के लिए उपयोग किया जाता है। किसी भी पैरामीटर सहित। "


लेकिन जो मुझे लगता है कि आप वास्तव में चाहते हैं ApplicationDeployment.CurrentDeployment.DataDirectory है जो आपको एक फ़ोल्डर देता है जिसे आप डेटा लिख ​​सकते हैं। जब आप एप्लिकेशन को वैसे भी अपडेट करते हैं तो आप खो देंगे जो मूल .exe फ़ोल्डर में था, लेकिन आप डेटा निर्देशिका को ऐप के नए संस्करण में माइग्रेट कर सकते हैं। आपका ऐप इस फोल्डर को लिख सकता है कि इसके पास जो भी लॉग फाइल है - और मुझे यकीन है कि इसकी गारंटी योग्य होगी।


मैंने कुछ नहीं किया, लेकिन पुराने डेटाडायरेक्टरी की फाइलें तैनाती के बाद अपने आप नए डेटाडायरेरी पर कॉपी हो जाती हैं। कोई .pre निर्देशिका भी नहीं हैं। (.NET फ्रेमवर्क 3.5 और 4.5)
Der_Meister

15

मैं .net 4.5.1 में Assembly.GetExecutingAssembly().Locationएक ClickOnceपरिनियोजित अनुप्रयोग के लिए पथ प्राप्त करने के लिए उपयोग कर रहा हूँ ।

हालाँकि, आपको ऐसे किसी भी फ़ोल्डर में नहीं लिखना चाहिए जहाँ आपका एप्लिकेशन हमेशा तैनात रहा हो, परिनियोजन विधि (xcopy, ClickOnce, InstallShield, कुछ भी) की परवाह किए बिना, क्योंकि वे आमतौर पर केवल नए विंडोज़ संस्करणों और सर्वर वातावरणों में, अनुप्रयोगों के लिए पढ़े जाते हैं।

एप्लिकेशन को हमेशा ऐसे उद्देश्यों के लिए आरक्षित फ़ोल्डर में लिखना चाहिए। आप उन फ़ोल्डरों को प्राप्त कर सकते हैं, जिनकी आपको पर्यावरण से शुरू होने वाली जरूरत है। स्पेसिफिक फोल्डर एन्यूमरेशन। MSDN पृष्ठ बताता है कि प्रत्येक फ़ोल्डर क्या है: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

डेटा, लॉग और अन्य फ़ाइलों के लिए यानी एक ApplicationData(रोमिंग), LocalApplicationData(स्थानीय) या का उपयोग कर सकते हैं CommonApplicationData। अस्थायी फ़ाइलों के लिए Path.GetTempPathया का उपयोग करें Path.GetTempFileName

सर्वर और डेस्कटॉप पर भी उपरोक्त कार्य।

EDIT: Assembly.GetExecutingAssembly()मुख्य निष्पादन योग्य में कहा जाता है।


यह मेरे लिए क्लिकऑन ऐप के लिए काम कर रहा है, साथ ही साथ वीएस देव वातावरण में भी काम कर रहा है।
डेवलपर

3

ClickOnce अनुप्रयोगों DO सी की उप-निर्देशिका के निवासी हैं: \ दस्तावेज़ और सेटिंग्स। उनके पास "क्लीन" इंस्टॉलेशन डायरेक्टरीज़ नहीं हैं क्योंकि स्थानीय फाइलें अनिवार्य रूप से "अस्थायी रूप से" डाउनलोड की जाती हैं ताकि एप्लिकेशन को स्थानीय पीसी पर चलने दिया जा सके और एप्लिकेशन का निष्पादन क्लिकऑन सर्वर से नियंत्रित किया जाता है जिसे वे प्रकाशन सेटिंग्स के आधार पर तैनात किया जाता है (अद्यतन, संस्करण आवश्यकताओं, आदि के लिए जाँच)।


मेरे पास सर्वर पर C: \ Documents & Settings फ़ोल्डर तक पहुंच नहीं है, जिसका अर्थ है कि मेरे पास ऐप बनाने वाली फ़ाइल तक पहुंच नहीं है। मैं एक निश्चित फ़ोल्डर से ऐप चलाता हूं। यह फ़ोल्डर है जहाँ ऐप प्रकाशित होता है। मुझे उस फ़ोल्डर का पथ कैसे मिलेगा?
टोनी_ हेनरिक

ओह, आप परिनियोजन URL चाहते हैं। क्षमा करें, मुझे वह बिल्कुल नहीं मिला। क्या आप इसे ClickOnce एप्लिकेशन के अंदर से या किसी बाहरी एप्लिकेशन से प्राप्त करने का प्रयास कर रहे हैं?
रॉबिनडॉटनेट

1

यहाँ मैंने पाया कि मेरे क्लिकऑन एप्लिकेशन के तैनात फ़ोल्डर स्थान को प्राप्त करने में सक्षम होने के लिए काम किया है और इसका उल्लेख कहीं भी नहीं किया गया है जो मैंने अपनी खोजों में, अपने समान, विशिष्ट परिदृश्य के लिए देखा है:

  • क्लिकऑन एप्लिकेशन को कंपनी LAN नेटवर्क फ़ोल्डर में तैनात किया जाता है।
  • क्लिकऑन एप्लिकेशन ऑनलाइन या ऑफलाइन उपलब्ध होना तय है।
  • मेरे क्लिकऑन इंस्टॉलेशन URL और मेरे प्रोजेक्ट गुणों में अपडेट URL में कुछ भी निर्दिष्ट नहीं है। यही है, स्थापना या अपडेट के लिए कोई अलग स्थान नहीं है।
  • मेरे प्रकाशन विकल्पों में, मैं क्लिकऑन एप्लिकेशन के लिए एक डेस्कटॉप शॉर्टकट बना रहा हूं।
  • जिस फ़ोल्डर को मैं स्टार्टअप के लिए पथ प्राप्त करना चाहता हूं वह एक है जिसे मैं पथ के हार्डकोडिंग के बिना, एप्लिकेशन के DEV, INT और PROD संस्करणों द्वारा एक्सेस करना चाहता हूं।

यहाँ मेरे उपयोग के मामले का एक दृश्य है:

यहां छवि विवरण दर्ज करें

  • नीले बॉक्स वाले फ़ोल्डर प्रत्येक वातावरण के अनुप्रयोग के लिए मेरी निर्देशिका स्थान हैं।
  • लाल बॉक्स्ड फ़ोल्डर वह निर्देशिका है जिसके लिए मैं पथ प्राप्त करना चाहता हूं (जिसके लिए पहले ऐप के तैनात फ़ोल्डर स्थान "MyClickOnceGreatApp_1_0_0_37" की आवश्यकता होती है जो ओपी के समान है)।

मुझे इस सवाल या उनकी टिप्पणियों में उस फ़ोल्डर को वापस करने के लिए काम करने के लिए कोई सुझाव नहीं मिला, जिस पर क्लिकऑन एप्लिकेशन को तैनात किया गया था (जो कि तब मैं इस फ़ोल्डर के सापेक्ष स्थानांतरित करूंगा, रुचि के फ़ोल्डर को खोजने के लिए)। कोई अन्य इंटरनेट खोज या संबंधित एसओ सवालों का जवाब नहीं मिला।

सभी सुझाए गए गुण या तो ऑब्जेक्ट के कारण विफल हो रहे थे (उदाहरण के लिए एक्टिवेशनयूरी) अशक्त होने के कारण, या स्थानीय पीसी के कैश्ड इंस्टॉल किए गए एप्लिकेशन फ़ोल्डर की ओर इशारा कर रहे थे। हां, मैं इस्कॉनड्रॉपल्ड के लिए एक चेक द्वारा सुशोभित रूप से अशक्त वस्तुओं को संभाल सकता हूं - यह कोई समस्या नहीं है - लेकिन आश्चर्यजनक रूप से IsNetworkDeployed गलत है, भले ही मैं वास्तव में क्लिकऑन एप्लिकेशन के लिए एक नेटवर्क परिनियोजित फ़ोल्डर स्थान रखता हूं। ऐसा इसलिए है क्योंकि एप्लिकेशन स्थानीय, कैश्ड बिट्स से चल रहा है।

समाधान को देखने के लिए है:

  • AppDomain.CurrentDomain.BaseDirectory जब मैं विकसित हो रहा हूं और जब दृश्य स्टूडियो के भीतर एप्लिकेशन चलाया जा रहा है
  • System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation जब यह सामान्य रूप से निष्पादित हो रहा है।

System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocationसही ढंग से उस नेटवर्क निर्देशिका को लौटाता है जो मेरे क्लिकऑन एप्लिकेशन को सभी मामलों में तैनात किया गया है। यह है, जब यह के माध्यम से शुरू किया गया है:

  • setup.exe
  • MyClickOnceGreatApp.application
  • डेस्कटॉप शॉर्टकट को पहले एप्लिकेशन के इंस्टॉल और लॉन्च पर बनाया गया था।

यहां वर्कअकाउंट फ़ोल्डर का पथ प्राप्त करने के लिए मैं एप्लिकेशन स्टार्टअप पर कोड का उपयोग करता हूं। तैनात किए गए एप्लिकेशन फ़ोल्डर को प्राप्त करना केवल मूल निर्देशिकाओं तक मार्च नहीं करने से सरल है:

string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
    directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
    try
    {
        string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
        path = path.Replace("file:", "");
        path = path.Replace("/", "\\");
        directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
    }
    catch (Exception ex)
    {
        directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
    }
}

0

यह मानते हुए कि क्लिकऑनके (सच == System.Deployment.ApplicationDeploy.IsNetworkDeployed) एप्लिकेशन उपयोगकर्ता के पीसी पर स्थापित है, उनके आवेदन के बाद इस फ़ोल्डर को प्राप्त करने के तीन तरीके हैं: एप्लिकेशन को फ़ोल्डर में फ़ाइलों तक पहुँचने के बारे में है।

String path1 = System.AppDomain.CurrentDomain.BaseDirectory;
String path2 = System.IO.Directory.GetCurrentDirectory();    
String path3 = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; //Remove the last path component, the executing assembly itself.

ये काम वी.एस. आईडीई से और एक तैनात / स्थापित क्लिकडॉन्से ऐप से, कोई "सत्य == System.Deployment.ApplicationDeploy.IsNetworkDeployed" चेक की आवश्यकता है। क्लिकऑन दृश्य स्टूडियो 2017 परियोजना में शामिल किसी भी फाइल को चुनता है, ताकि वास्तव में एप्लिकेशन किसी भी और सभी तैनात फाइलों को आवेदन के भीतर से संबंधित रास्तों का उपयोग करके एक्सेस कर सके।

यह विंडोज 10 और विजुअल स्टूडियो 2017 पर आधारित है

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