मैं .NET कंसोल एप्लिकेशन में एप्लिकेशन का पथ कैसे प्राप्त कर सकता हूं?


952

मैं कंसोल एप्लिकेशन में एप्लिकेशन का पथ कैसे खोजूं?

में Windows Forms , मैं उपयोग कर सकते हैं Application.StartupPathवर्तमान पथ को खोजने के लिए, लेकिन यह एक सांत्वना आवेदन में उपलब्ध हो प्रतीत नहीं होता है।


5
क्या आप लक्ष्य (क्लाइंट, डेवलपमेंट) मशीन पर .NET फ्रेमवर्क स्थापित करते हैं? यदि आपका उत्तर सत्य है; तो, आप System.Windows.Forms.dll का संदर्भ जोड़ सकते हैं और Application.StartupPath का उपयोग कर सकते हैं! यदि आप भविष्य के अपवादों को छोड़ना चाहते हैं तो यह सबसे अच्छा तरीका है!
एहसान मोहम्मदी

AppDomain.BaseDirectory ऐप डायरेक्टरी है। विदित हो कि एप्लिकेशन VS env और Win env में भिन्न व्यवहार कर सकता है। लेकिन AppDomain केवल application.path के समान नहीं होना चाहिए, लेकिन मुझे आशा है कि यह केवल IIS के लिए नहीं है।
मर्टुआरेज़

जवाबों:


1179

System.Reflection.Assembly.GetExecutingAssembly()1Location

System.IO.Path.GetDirectoryNameअगर आप चाहते हैं कि सभी निर्देशिका है के साथ गठबंधन ।

1 मि। मिंडोर की टिप्पणी के अनुसार:
System.Reflection.Assembly.GetExecutingAssembly().Location वर्तमान में निष्पादित विधानसभा जहां स्थित है, वह रिटर्न, जो निष्पादित नहीं होने पर विधानसभा स्थित है या नहीं हो सकता है। छाया प्रतिलिपि असेंबलियों के मामले में, आपको एक अस्थायी निर्देशिका में एक रास्ता मिलेगा। System.Reflection.Assembly.GetExecutingAssembly().CodeBaseविधानसभा का 'स्थायी' मार्ग लौटाएगा।


243
System.Reflection.Assembly.GetExecutingAssembly ()। स्थान रिटर्न जहां निष्पादित विधानसभा वर्तमान में स्थित है, जो हो सकता है या जहां विधानसभा स्थित नहीं है, वहां हो सकता है। छाया प्रतिलिपि असेंबलियों के मामले में, आपको एक अस्थायी निर्देशिका में एक रास्ता मिलेगा। System.Reflection.Assembly.GetExecutingAssembly ()। CodeBase असेंबली के ' पर्मेंन्ट ' पथ को लौटा देगा ।
मि। मिंडोर

13
@ समगोल्डबर्ग: यह निर्भर करता है कि इसका उपयोग कैसे किया जाता है: stackoverflow.com/q/1068420/391656 । या आप कर सकते हैं ... नई उड़ी (System.Reflection.Assembly.GetExecutingAssembly ()) .Base) .LocalPath
Mr.Mindor

28
GetExecutingAssemblyअसेंबली देता है जिसमें वर्तमान में निष्पादित कोड है । यह आवश्यक रूप से कंसोल .exe असेंबली नहीं हो सकता है । यह एक असेंबली हो सकती है जिसे पूरी तरह से अलग स्थान से लोड किया गया है। आपको उपयोग करना होगा GetEntryAssembly! यह भी ध्यान दें कि CodeBaseविधानसभा GAC में होने पर सेट नहीं किया जा सकता है। बेहतर विकल्प है AppDomain.CurrentDomain.BaseDirectory
बिटबैंक

3
कृपया 4 स्थानों में कोड लिखें ताकि इसे कॉपी करना आसान हो
fnc12

3
यदि आप dll, System.Reflection.Assembly.GetExecutingAssembly () को कॉल करते हैं, तो कोडबेस को "फ़ाइल: /// C: /Windows/Microsoft.NET/Framework64/v4.0/30319/mscorlib.dll"
raidsan

407

आप वर्तमान एप्लिकेशन निर्देशिका प्राप्त करने के लिए निम्न कोड का उपयोग कर सकते हैं।

AppDomain.CurrentDomain.BaseDirectory

42
यह प्रयोग न करें। बेसडायरेक्ट्री को रनटाइम पर सेट किया जा सकता है। यह सही होने की गारंटी नहीं है (जैसे स्वीकृत उत्तर)।
usr

3
+1 यह संभावना है कि आप चाहते हैं कि उत्तर छाया प्रति की भरपाई हो।
जॉर्ज मौयर

4
@usr आपको क्या लगता है कि BaseDirectoryरनटाइम पर सेट किया जा सकता है? इसके पास केवल एक गेटटर है।
बिटबैंक

3
@bitbonk इसे एपडोमेन क्रिएशन टाइम पर सेट किया जा सकता है।
usr

3
क्या ऐसा नहीं है कि BaseDirectory को * .lnk फ़ाइल में, "स्टार्ट इन:" फ़ील्ड में बदला जा सकता है?
अलेक्जेंडर

170

आपके पास आवेदन की निर्देशिका खोजने के लिए दो विकल्प हैं, जो आप चुनते हैं वह आपके उद्देश्य पर निर्भर करेगा।

// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests, 
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);

3
बस कहना चाहता था, जाहिर है कि 2 विकल्प से अधिक कई विकल्प हैं कि कितने अन्य विकल्प पोस्ट किए गए हैं ...
vapcguy

17
यदि आप जो कुछ भी करने की कोशिश कर रहे हैं, वह यूआरआई प्रारूप का समर्थन नहीं करता है, तो उपयोग करेंvar localDirectory = new Uri(directory).LocalPath;
स्कॉट सोमर

यह सिर्फ गलत है। निष्पादन योग्य क्या है। .NET असेंबली बिल्कुल नहीं है सही उत्तर पर्यावरण की जांच करना और कमांड लाइन का निरीक्षण करना है।
अंक

@ Ukuma.Scott यह काम नहीं करता है यदि पथ
सम्‍मिलित है

82

शायद थोड़ा देर से लेकिन यह एक उल्लेख के लायक है:

Environment.GetCommandLineArgs()[0];

या अधिक सही ढंग से सिर्फ निर्देशिका पथ प्राप्त करने के लिए:

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

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

काफी लोगों ने बताया है कि GetCommandLineArgsकार्यक्रम का नाम वापस करने की गारंटी नहीं है। देखें कमांड लाइन पर पहला शब्द केवल कन्वेंशन द्वारा प्रोग्राम का नाम है । लेख बताता है कि "हालांकि बहुत कम विंडोज प्रोग्राम इस क्विक का उपयोग करते हैं (मुझे स्वयं किसी के बारे में पता नहीं है)"। इसलिए 'स्पूफ' संभव है GetCommandLineArgs, लेकिन हम कंसोल एप्लिकेशन के बारे में बात कर रहे हैं। कंसोल ऐप आमतौर पर जल्दी और गंदे होते हैं। मेरी KISS दर्शन के साथ में यह फिट तो।


1
@ आप जिस स्थिति से जूझते हैं, वह अत्यधिक सैद्धांतिक है। कंसोल एप्लिकेशन के संदर्भ में, यह वास्तव में किसी अन्य विधि का उपयोग करने के लिए समझ में नहीं आता है। इसे सरल रखें!
स्टीव मैक

1
@usr mmm - जो मैं कह रहा हूं उसके पीछे टास्कमग्राउंड cmdline कॉलम को देखते हुए। सिर्फ एक्स के नाम के साथ कुछ सिस्टम सेवाएं। कोई बात नहीं। मैं जो कहने की कोशिश कर रहा हूं वह यह है कि सांत्वना एप्लिकेशन को विकसित करते समय चीजों को अधिक जटिल बनाने की आवश्यकता नहीं है क्योंकि वे होने की आवश्यकता है। खासकर तब जब हमारे पास पहले से ही जानकारी उपलब्ध हो। अब, यदि आप GetCommandLineArgs को ट्रिक करने के लिए इस तरह से एक कंसोल एप्लिकेशन चला रहे हैं, तो आप पहले से ही हुप्स के माध्यम से कूद रहे हैं और आपको शायद खुद से पूछना होगा कि क्या कंसोल ऐप जाने का सही तरीका है।
स्टीव मैक

5
आपके "सरल" समाधान में दो विधि कॉल शामिल हैं। "जटिल" समाधान में दो विधि कॉल शामिल हैं। कोई व्यावहारिक अंतर नहीं है - सिवाय इसके कि "सरल" समाधान आपको कुछ परिस्थितियों में गलत जवाब दे सकता है जो आपके कार्यक्रम को लिखते समय आपके नियंत्रण में नहीं होते हैं। जोखिम क्यों लेते हैं? अन्य दो विधि कॉल का उपयोग करें, और आपका प्रोग्राम अधिक जटिल नहीं होगा, बल्कि अधिक विश्वसनीय होगा।
क्रिस

3
मेरे परिदृश्य के लिए काम किया, अन्य समाधान नहीं थे, इसलिए एक और विकल्प प्रदान करने के लिए धन्यवाद :-) मैं एक एमएस यूनिट परीक्षण चलाने के लिए रीशर टेस्ट रनर का उपयोग कर रहा था और जिस कोड का मैं परीक्षण कर रहा था, उसे निष्पादित निर्देशिका में होने के लिए एक विशिष्ट .dll की आवश्यकता थी। ..और असेंबली। GetExecutingDirectory () अजीब तरह से एक अलग परिणाम देता है।
दीवारिस्मार्क

1
@ क्रिस - इस उत्तर की रक्षा के लिए। यह यूनिट परीक्षणों के लिए काम करता है, गेटएंट्रीएस्वाम सॉल्यूशन नहीं करता है, क्योंकि गेटएंट्रीएस्वास्म नॉरल रिटर्न देता है। GetExecutingAssembly का प्रस्ताव करने वाले उत्तर फर्जी हैं, क्योंकि वे केवल निष्पादन योग्य वापस करते हैं यदि निष्पादन विधानसभा निष्पादन योग्य है। यह सरल नहीं है, लेकिन सही समाधान है।
अंक

44

Asp.net वेब एप्लिकेशन में रुचि रखने वाले किसी के लिए। यहाँ मेरे 3 अलग अलग तरीकों के परिणाम हैं

protected void Application_Start(object sender, EventArgs e)
{
  string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
  string p3 = this.Server.MapPath("");
  Console.WriteLine("p1 = " + p1);
  Console.WriteLine("p2 = " + p2);
  Console.WriteLine("p3 = " + p3);
}

परिणाम

p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging

एप्लिकेशन "C: \ inetpub \ SBSPortal_staging" से भौतिक रूप से चल रहा है, इसलिए पहला समाधान निश्चित रूप से वेब ऐप्स के लिए उपयुक्त नहीं है।


42

ऊपर दिए गए उत्तर का 90% मुझे क्या चाहिए था, लेकिन मेरे लिए एक नियमित मार्ग के बजाय उरी लौट आया।

जैसा कि MSDN फ़ोरम पोस्ट में बताया गया है, URI पथ को सामान्य फ़ाइलपथ में कैसे बदलें? , मैंने निम्नलिखित प्रयोग किया:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
    System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;

1
यह भी अच्छी तरह से काम करता है, अगर प्रश्न में exe एक विंडोज़ सेवा है और वर्तमान निर्देशिका C: \ Windows \ system32 देता है। उपरोक्त कोड exe का वास्तविक स्थान लौटाता है
DaImTo

इसके अलावा अगर आप कुछ करने की कोशिश करते हैं File.CreateDirectory(path), तो यह आपको अपवाद देगा कि यह URI रास्तों की अनुमति नहीं देता है ...
vapcguy

1
दुर्भाग्य से यह उन रास्तों के लिए काम नहीं करता है जिनमें एक टुकड़ा पहचानकर्ता ( #चरित्र) होता है। पहचानकर्ता और इसके बाद की सभी चीजें परिणामस्वरूप पथ से काट दी जाती हैं।
bgfvdu3w 8

तुम क्यों नहीं स्वैप new Uriऔर System.IO.Path.GetDirectoryName? यह आपको एक सामान्य पथ स्ट्रिंग देता है Uri
तिमो

मुझे यह सबसे अच्छा लगता है। इसी दृष्टिकोण ने किसी भी वातावरण में मेरे लिए मज़बूती से काम किया है। उत्पादन में, स्थानीय रूप से डिबगिंग, यूनिट परीक्षण ... एक इकाई परीक्षण में शामिल एक सामग्री फ़ाइल को खोलना चाहते हैं ("सामग्री - प्रतिलिपि यदि नया")? यह वहाँ है।
टिमो

29

आप ऐसा करना चाह रहे होंगे:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

23

आप इसके बजाय इसका उपयोग कर सकते हैं।

System.Environment.CurrentDirectory

यह हालांकि निष्पादन योग्य का फ़ोल्डर प्राप्त करेगा
Iain

इसे कई तरीकों से बदला जा सकता है (शॉर्टकट सेटिंग्स आदि) ... इसका उपयोग न करना बेहतर है।
युषा अलबायो

23

यदि आप .NET कोर संगत तरीके की तलाश कर रहे हैं, तो उपयोग करें

System.AppContext.BaseDirectory

यह .NET फ्रेमवर्क 4.6 और .NET कोर 1.0 (और .NET मानक 1.3) में पेश किया गया था। देखें: AppContext.BaseDirectory संपत्ति

इस पृष्ठ के अनुसार ,

यह .NET कोर में AppDomain.CurrentDomain.BaseDirectory के लिए पसंदीदा प्रतिस्थापन है


स्व-निहित डॉटनेट कंसोल एप्लिकेशन के लिए भी github.com/dotnet/runtime/issues/13051 देखें । यहाँ सिफारिश का उपयोग करने के लिए हैProcess.GetCurrentProcess().MainModule.FileName
गेविन

19

कंसोल एप्लिकेशन के लिए, आप यह कोशिश कर सकते हैं:

System.IO.Directory.GetCurrentDirectory();

आउटपुट (मेरी स्थानीय मशीन पर):

c: \ users \ xxxxxxx \ documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debuk

या आप कोशिश कर सकते हैं (अंत में एक अतिरिक्त बैकस्लैश है):

AppDomain.CurrentDomain.BaseDirectory

आउटपुट:

c: \ users \ xxxxxxx \ documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug \


" BaseDirectoryरनटाइम पर सेट किया जा सकता है। यह सही होने की गारंटी नहीं है"
Yousha Aleayoub


9

आप बस अपनी परियोजना के संदर्भ में जोड़ सकते हैं System.Windows.Formsऔर फिर System.Windows.Forms.Application.StartupPath हमेशा की तरह उपयोग कर सकते हैं ।

तो, अधिक जटिल तरीकों या प्रतिबिंब का उपयोग करने की आवश्यकता नहीं है।


मैंने उस एक का उपयोग किया, और यह अच्छी तरह से काम करता है। लेकिन एक बार मैंने अपने यूनिट टेस्ट प्रोजेक्ट में इस पद्धति का उपयोग किया। और हां, यह विफल हो गया क्योंकि यह C: \ PROGRAM FILES (X86) \ MICROSOFT VISUAL STUDIO 14.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TINWINDOW
ainasiart

@ainasiart तो यूनिट परीक्षण के दौरान मुझे यह कैसे काम करना है ??
निकोलस सीगमंड्ट

7

अगर इसे डबल क्लिक करके एक्सई कहा जाता है तो मैं इसका उपयोग करता हूं

var thisPath = System.IO.Directory.GetCurrentDirectory();

5
यह सही नहीं है क्योंकि आप परिणाम में यादृच्छिक निर्देशिका प्राप्त कर सकते हैं।
अमूलर

यह आदेश पर्यावरण लौटाता है। CurrentDirectory, जिसे किसी भी पथ पर रनटाइम में बदला जा सकता है, इसलिए यह एक विश्वसनीय समाधान नहीं है।
यूरी कोज़लोव

7

मैंने उपयोग कर लिया है

System.AppDomain.CurrentDomain.BaseDirectory

जब मैं एक अनुप्रयोग फ़ोल्डर के सापेक्ष पथ खोजना चाहता हूं। यह ASP.Net और विनफॉर्म अनुप्रयोगों दोनों के लिए काम करता है। यह System.Web विधानसभाओं के लिए किसी भी संदर्भ की आवश्यकता नहीं है।


7

निम्नलिखित पंक्ति आपको एक आवेदन मार्ग देगी:

var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

उपरोक्त समाधान निम्नलिखित स्थितियों में ठीक से काम कर रहा है:

  • सरल अनुप्रयोग
  • किसी अन्य डोमेन में, जहाँ असेंबली .GetEntryAssembly () शून्य हो जाएगा
  • DLL एंबेडेड संसाधनों से एक बाइट सरणी के रूप में लोड किया गया है और असेंबली के रूप में AppDomain को लोड किया गया है। लोड (byteArrayOfEmbeddedDll)
  • मोनो के mkbundleबंडलों के साथ (कोई अन्य तरीके काम नहीं करते)

लिनक्स पर डिबगर के तहत यह रिटर्न: / usr / शेयर / डॉटनेट
व्लादिमीर

6

मेरा मतलब है, क्यों नहीं एपी / आह्वान विधि?

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    public class AppInfo
    {
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
            private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
            private static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
            public static string StartupPath
            {
                get
                {
                    StringBuilder stringBuilder = new StringBuilder(260);
                    GetModuleFileName(NullHandleRef, stringBuilder, stringBuilder.Capacity);
                    return Path.GetDirectoryName(stringBuilder.ToString());
                }
            }
    }

आप इसे Application.StartupPath की तरह उपयोग करेंगे:

    Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");

2
जब इसके लिए बहुत अधिक .NET है तो p / invoke क्यों?
18

7
@ user3596865 क्योंकि यह विंडोज के लिए एक कठिन निर्भरता को पुन: पेश करता है और DNX या मोनो के साथ संगत नहीं है। और शायद भविष्य के विंडोज संस्करणों में एक ब्रेकिंग परिवर्तन है। तो फिर से: क्यों हम यहाँ pinvoke का उपयोग करना चाहिए?
बेन

5

Assembly.GetEntryAssembly().Location या Assembly.GetExecutingAssembly().Location

System.IO.Path.GetDirectoryName()केवल निर्देशिका प्राप्त करने के लिए संयोजन में उपयोग करें ।

से रास्तों GetEntryAssembly()और GetExecutingAssembly()अलग हो सकता है, भले ही ज्यादातर मामलों के लिए निर्देशिका में एक ही हो जाएगा।

यदि GetEntryAssembly()आपको पता है कि nullप्रवेश मॉड्यूल अप्रबंधित है (यानी C ++ या VB6 निष्पादन योग्य) तो यह वापस आ सकता है । उन मामलों GetModuleFileNameमें Win32 API से इसका उपयोग करना संभव है :

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);

5

VB.net में

My.Application.Info.DirectoryPath

मेरे लिए काम करता है (अनुप्रयोग प्रकार: कक्षा पुस्तकालय)। C # के बारे में निश्चित नहीं है ... स्ट्रिंग के रूप में पथ w / o Filename लौटाता है


4
AppDomain.CurrentDomain.BaseDirectory

इंस्टॉलेशन पैकेज के साथ तृतीय पक्ष संदर्भ फ़ाइलों को संदर्भित करने के लिए समस्या का समाधान करेगा।


11
यह उत्तर 5 साल पहले ही सुझाया जा चुका है, एक बार से भी अधिक।
PL

2

इन तरीकों में से कोई भी विशेष मामलों में काम नहीं करता है जैसे निर्वासन के लिए एक प्रतीकात्मक लिंक का उपयोग करना, वे लिंक के स्थान को वापस करेंगे वास्तविक एक्सई नहीं।

तो उस के आसपास पाने के लिए QueryFullProcessImageName का उपयोग कर सकते हैं :

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, [Out]StringBuilder lpExeName, ref int lpdwSize);

    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern IntPtr OpenProcess(
        UInt32 dwDesiredAccess,
        [MarshalAs(UnmanagedType.Bool)]
        Boolean bInheritHandle,
        Int32 dwProcessId
    );
}

public static class utils
{

    private const UInt32 PROCESS_QUERY_INFORMATION = 0x400;
    private const UInt32 PROCESS_VM_READ = 0x010;

    public static string getfolder()
    {
        Int32 pid = Process.GetCurrentProcess().Id;
        int capacity = 2000;
        StringBuilder sb = new StringBuilder(capacity);
        IntPtr proc;

        if ((proc = NativeMethods.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pid)) == IntPtr.Zero)
            return "";

        NativeMethods.QueryFullProcessImageName(proc, 0, sb, ref capacity);

        string fullPath = sb.ToString(0, capacity);

        return Path.GetDirectoryName(fullPath) + @"\";
    }
}

2

कोड की इस सरल रेखा को आज़माएं:

 string exePath = Path.GetDirectoryName( Application.ExecutablePath);

1

एक अन्य समाधान वर्तमान पथ की ओर इशारा करते हुए सापेक्ष रास्तों का उपयोग कर रहा है:

Path.GetFullPath(".")

यह वर्तमान निर्देशिका को प्राप्त करता है, प्रारंभिक EXE का स्थान नहीं।
दसफोर

0

मैंने किसी को भी .net कोर प्रतिबिंब द्वारा प्रदान किए गए LocalPath को एक प्रयोग करने योग्य System.IO पथ में परिवर्तित करने के लिए नहीं देखा, इसलिए यहां मेरा संस्करण है।

public static string GetApplicationRoot()
{
   var exePath = new Uri(System.Reflection.
   Assembly.GetExecutingAssembly().CodeBase).LocalPath;

   return new FileInfo(exePath).DirectoryName;

}

यह पूर्ण "C: \ xxx \ xxx" स्वरूपित पथ को उस स्थान पर लौटा देगा जहां आपका कोड है।


0

निष्पादन योग्य मार्ग प्राप्त करने के कई तरीके हैं, जिन्हें हमें इसका उपयोग करना चाहिए यह हमारी आवश्यकताओं पर निर्भर करता है यहां एक लिंक है जो विभिन्न तरीकों पर चर्चा करता है।

एप्लिकेशन निष्पादन पथ प्राप्त करने के विभिन्न तरीके


-1

यहां एक विश्वसनीय समाधान है जो 32 बिट और 64 बिट अनुप्रयोगों के साथ काम करता है ।

इन संदर्भों को जोड़ें:

System.Diagnostics का उपयोग करना;

System.Management का उपयोग कर;

इस विधि को अपनी परियोजना में जोड़ें:

public static string GetProcessPath(int processId)
{
    string MethodResult = "";
    try
    {
        string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;

        using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
        {
            using (ManagementObjectCollection moc = mos.Get())
            {
                string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();

                MethodResult = ExecutablePath;

            }

        }

    }
    catch //(Exception ex)
    {
        //ex.HandleException();
    }
    return MethodResult;
}

अब इसे ऐसे उपयोग करें:

int RootProcessId = Process.GetCurrentProcess().Id;

GetProcessPath(RootProcessId);

ध्यान दें कि यदि आप प्रक्रिया की आईडी जानते हैं, तो यह विधि संबंधित ExecutePath को वापस कर देगी।

अतिरिक्त, रुचि रखने वालों के लिए:

Process.GetProcesses() 

... आपको वर्तमान में चल रही सभी प्रक्रियाओं की एक सरणी देगा, और ...

Process.GetCurrentProcess()

... आपको उनकी जानकारी के साथ-साथ ईद आदि की वर्तमान प्रक्रिया भी देनी होगी और सीमित नियंत्रण जैसे कि किल इत्यादि। *


-5

आप समाधान एक्सप्लोरर का उपयोग करके परियोजना के भीतर संसाधन के रूप में एक फ़ोल्डर नाम बना सकते हैं, फिर आप संसाधन के भीतर एक फ़ाइल पेस्ट कर सकते हैं।

private void Form1_Load(object sender, EventArgs e) {
    string appName = Environment.CurrentDirectory;
    int l = appName.Length;
    int h = appName.LastIndexOf("bin");
    string ll = appName.Remove(h);                
    string g = ll + "Resources\\sample.txt";
    System.Diagnostics.Process.Start(g);
}

6
एन्वायरन्मेंट का उपयोग करना। CurrentDirectory बहुत गलत है, इसका उपयोग न करें! यह रास्ता रनटाइम में बदल सकता है। स्टार्टअप पर भी यह गैर-नियतात्मक है।
usr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.