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




console console-application (20)

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

AppDomain.CurrentDomain.BaseDirectory

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

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


वीबीनेट में

My.Application.Info.DirectoryPath

मेरे लिए काम करता है (आवेदन का प्रकार: कक्षा पुस्तकालय)। सी # के बारे में निश्चित नहीं है ... स्ट्रिंग के रूप में फ़ाइल w / o फ़ाइल नाम देता है

बीआर, डैनियल


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

System.AppDomain.CurrentDomain.BaseDirectory

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


AppDomain.CurrentDomain.BaseDirectory

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


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

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

   return new FileInfo(exePath).DirectoryName;

}

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


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

System.Environment.CurrentDirectory

यहां एक विश्वसनीय समाधान है जो 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()

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


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

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

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

आवेदन निष्पादन योग्य पथ प्राप्त करने के विभिन्न तरीके


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

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

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

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


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

Environment.GetCommandLineArgs()[0];

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

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

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

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


उपर्युक्त उत्तर 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;

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

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

कंसोल अनुप्रयोगों के लिए, आप इसे आजमा सकते हैं:

System.IO.Directory.GetCurrentDirectory();

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

सी: \ उपयोगकर्ता \ xxxxxxx \ दस्तावेज़ \ दृश्य स्टूडियो 2012 \ परियोजनाएं \ ImageHandler \ GetDir \ bin \ डीबग

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

AppDomain.CurrentDomain.BaseDirectory

आउटपुट:

सी: \ उपयोगकर्ता \ xxxxxxx \ दस्तावेज़ \ दृश्य स्टूडियो 2012 \ परियोजनाएं \ ImageHandler \ GetDir \ bin \ Debug \


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

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

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

तो 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) + @"\";
    }
}

एएसपीनेट वेब ऐप्स में रुचि रखने वाले किसी के लिए। यहां 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" से चल रहा है, इसलिए पहला समाधान निश्चित रूप से वेब ऐप्स के लिए उपयुक्त नहीं है।


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

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

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

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

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




console-application