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




console console-application (17)

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

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


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

System.Environment.CurrentDirectory

आप ऐसा करने के लिए देख रहे हो सकता है:

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

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

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

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

// 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);

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

जैसा कि एमएसडीएन फ़ोरम पोस्ट में बताया गया है, यूआरआई पथ को सामान्य फ़ाइलपैथ में कैसे परिवर्तित करें? , मैंने निम्नलिखित का उपयोग किया:

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

एएसपीनेट वेब ऐप्स में रुचि रखने वाले किसी के लिए। यहां 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

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


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

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

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

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

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

  • सरल ऐप
  • एक और डोमेन में जहां विधानसभा.GetEntryAssembly () शून्य वापस आ जाएगा
  • डीएलएल को एंबेडेड संसाधनों से बाइट सरणी के रूप में लोड किया गया है और एपडोमेन को असेंबली के रूप में लोड किया गया है। लोड (बाइटएर्रेऑफएम्बेडड डीएल)

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

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

आप इसे एप्लिकेशन की तरह इस्तेमाल करेंगे। स्टार्टअपपाथ:

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

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

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

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

System.AppDomain.CurrentDomain.BaseDirectory

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


मैंने किसी को भी एक उपयोगी सिस्टम.आईओ पथ में नेट कोर प्रतिबिंब द्वारा प्रदान की गई लोकलपैथ को परिवर्तित नहीं किया है, इसलिए मेरा संस्करण यहां है।

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

   return new FileInfo(exePath).DirectoryName;

}

यह आपका कोड कहां से पूर्ण "सी: \ xxx \ xxx" प्रारूपित पथ लौटाएगा।


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

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

सिस्टम का उपयोग कर। डायग्नोस्टिक्स;

सिस्टम का उपयोग कर। प्रबंधन;

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

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

... आपको अपनी जानकारी जैसे आईडी, इत्यादि के साथ वर्तमान प्रक्रिया देगा और सीमित नियंत्रण जैसे कि किल, आदि *


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

AppDomain.CurrentDomain.BaseDirectory

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

Environment.GetCommandLineArgs()[0];

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

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

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

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


System.Reflection.Assembly.GetExecutingAssembly()Location 1

System.IO.Path.GetDirectoryName साथ संयोजित करें यदि आप चाहते हैं कि निर्देशिका है।

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


AppDomain.CurrentDomain.BaseDirectory

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





console-application