मैं कंसोल एप्लिकेशन में एप्लिकेशन का पथ कैसे खोजूं?
में Windows Forms , मैं उपयोग कर सकते हैं Application.StartupPath
वर्तमान पथ को खोजने के लिए, लेकिन यह एक सांत्वना आवेदन में उपलब्ध हो प्रतीत नहीं होता है।
मैं कंसोल एप्लिकेशन में एप्लिकेशन का पथ कैसे खोजूं?
में Windows Forms , मैं उपयोग कर सकते हैं Application.StartupPath
वर्तमान पथ को खोजने के लिए, लेकिन यह एक सांत्वना आवेदन में उपलब्ध हो प्रतीत नहीं होता है।
जवाबों:
System.Reflection.Assembly.GetExecutingAssembly()
। 1Location
System.IO.Path.GetDirectoryName
अगर आप चाहते हैं कि सभी निर्देशिका है के साथ गठबंधन ।
1 मि। मिंडोर की टिप्पणी के अनुसार:
System.Reflection.Assembly.GetExecutingAssembly().Location
वर्तमान में निष्पादित विधानसभा जहां स्थित है, वह रिटर्न, जो निष्पादित नहीं होने पर विधानसभा स्थित है या नहीं हो सकता है। छाया प्रतिलिपि असेंबलियों के मामले में, आपको एक अस्थायी निर्देशिका में एक रास्ता मिलेगा।System.Reflection.Assembly.GetExecutingAssembly().CodeBase
विधानसभा का 'स्थायी' मार्ग लौटाएगा।
GetExecutingAssembly
असेंबली देता है जिसमें वर्तमान में निष्पादित कोड है । यह आवश्यक रूप से कंसोल .exe असेंबली नहीं हो सकता है । यह एक असेंबली हो सकती है जिसे पूरी तरह से अलग स्थान से लोड किया गया है। आपको उपयोग करना होगा GetEntryAssembly
! यह भी ध्यान दें कि CodeBase
विधानसभा GAC में होने पर सेट नहीं किया जा सकता है। बेहतर विकल्प है AppDomain.CurrentDomain.BaseDirectory
।
आप वर्तमान एप्लिकेशन निर्देशिका प्राप्त करने के लिए निम्न कोड का उपयोग कर सकते हैं।
AppDomain.CurrentDomain.BaseDirectory
BaseDirectory
रनटाइम पर सेट किया जा सकता है? इसके पास केवल एक गेटटर है।
आपके पास आवेदन की निर्देशिका खोजने के लिए दो विकल्प हैं, जो आप चुनते हैं वह आपके उद्देश्य पर निर्भर करेगा।
// 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);
var localDirectory = new Uri(directory).LocalPath;
शायद थोड़ा देर से लेकिन यह एक उल्लेख के लायक है:
Environment.GetCommandLineArgs()[0];
या अधिक सही ढंग से सिर्फ निर्देशिका पथ प्राप्त करने के लिए:
System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
संपादित करें:
काफी लोगों ने बताया है कि GetCommandLineArgs
कार्यक्रम का नाम वापस करने की गारंटी नहीं है। देखें कमांड लाइन पर पहला शब्द केवल कन्वेंशन द्वारा प्रोग्राम का नाम है । लेख बताता है कि "हालांकि बहुत कम विंडोज प्रोग्राम इस क्विक का उपयोग करते हैं (मुझे स्वयं किसी के बारे में पता नहीं है)"। इसलिए 'स्पूफ' संभव है GetCommandLineArgs
, लेकिन हम कंसोल एप्लिकेशन के बारे में बात कर रहे हैं। कंसोल ऐप आमतौर पर जल्दी और गंदे होते हैं। मेरी KISS दर्शन के साथ में यह फिट तो।
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" से भौतिक रूप से चल रहा है, इसलिए पहला समाधान निश्चित रूप से वेब ऐप्स के लिए उपयुक्त नहीं है।
ऊपर दिए गए उत्तर का 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;
File.CreateDirectory(path)
, तो यह आपको अपवाद देगा कि यह URI रास्तों की अनुमति नहीं देता है ...
#
चरित्र) होता है। पहचानकर्ता और इसके बाद की सभी चीजें परिणामस्वरूप पथ से काट दी जाती हैं।
new Uri
और System.IO.Path.GetDirectoryName
? यह आपको एक सामान्य पथ स्ट्रिंग देता है Uri
।
आप इसके बजाय इसका उपयोग कर सकते हैं।
System.Environment.CurrentDirectory
यदि आप .NET कोर संगत तरीके की तलाश कर रहे हैं, तो उपयोग करें
System.AppContext.BaseDirectory
यह .NET फ्रेमवर्क 4.6 और .NET कोर 1.0 (और .NET मानक 1.3) में पेश किया गया था। देखें: AppContext.BaseDirectory संपत्ति ।
इस पृष्ठ के अनुसार ,
यह .NET कोर में AppDomain.CurrentDomain.BaseDirectory के लिए पसंदीदा प्रतिस्थापन है
Process.GetCurrentProcess().MainModule.FileName
कंसोल एप्लिकेशन के लिए, आप यह कोशिश कर सकते हैं:
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
रनटाइम पर सेट किया जा सकता है। यह सही होने की गारंटी नहीं है"
मैंने इस कोड का उपयोग किया है और इसका समाधान प्राप्त करता हूं।
AppDomain.CurrentDomain.BaseDirectory
आप बस अपनी परियोजना के संदर्भ में जोड़ सकते हैं System.Windows.Forms
और फिर System.Windows.Forms.Application.StartupPath
हमेशा की तरह उपयोग कर सकते हैं ।
तो, अधिक जटिल तरीकों या प्रतिबिंब का उपयोग करने की आवश्यकता नहीं है।
अगर इसे डबल क्लिक करके एक्सई कहा जाता है तो मैं इसका उपयोग करता हूं
var thisPath = System.IO.Directory.GetCurrentDirectory();
मैंने उपयोग कर लिया है
System.AppDomain.CurrentDomain.BaseDirectory
जब मैं एक अनुप्रयोग फ़ोल्डर के सापेक्ष पथ खोजना चाहता हूं। यह ASP.Net और विनफॉर्म अनुप्रयोगों दोनों के लिए काम करता है। यह System.Web विधानसभाओं के लिए किसी भी संदर्भ की आवश्यकता नहीं है।
निम्नलिखित पंक्ति आपको एक आवेदन मार्ग देगी:
var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
उपरोक्त समाधान निम्नलिखित स्थितियों में ठीक से काम कर रहा है:
mkbundle
बंडलों के साथ (कोई अन्य तरीके काम नहीं करते)मेरा मतलब है, क्यों नहीं एपी / आह्वान विधि?
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");
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);
AppDomain.CurrentDomain.BaseDirectory
इंस्टॉलेशन पैकेज के साथ तृतीय पक्ष संदर्भ फ़ाइलों को संदर्भित करने के लिए समस्या का समाधान करेगा।
इन तरीकों में से कोई भी विशेष मामलों में काम नहीं करता है जैसे निर्वासन के लिए एक प्रतीकात्मक लिंक का उपयोग करना, वे लिंक के स्थान को वापस करेंगे वास्तविक एक्सई नहीं।
तो उस के आसपास पाने के लिए 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) + @"\";
}
}
कोड की इस सरल रेखा को आज़माएं:
string exePath = Path.GetDirectoryName( Application.ExecutablePath);
एक अन्य समाधान वर्तमान पथ की ओर इशारा करते हुए सापेक्ष रास्तों का उपयोग कर रहा है:
Path.GetFullPath(".")
मैंने किसी को भी .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" स्वरूपित पथ को उस स्थान पर लौटा देगा जहां आपका कोड है।
निष्पादन योग्य मार्ग प्राप्त करने के कई तरीके हैं, जिन्हें हमें इसका उपयोग करना चाहिए यह हमारी आवश्यकताओं पर निर्भर करता है यहां एक लिंक है जो विभिन्न तरीकों पर चर्चा करता है।
यहां एक विश्वसनीय समाधान है जो 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()
... आपको उनकी जानकारी के साथ-साथ ईद आदि की वर्तमान प्रक्रिया भी देनी होगी और सीमित नियंत्रण जैसे कि किल इत्यादि। *
आप समाधान एक्सप्लोरर का उपयोग करके परियोजना के भीतर संसाधन के रूप में एक फ़ोल्डर नाम बना सकते हैं, फिर आप संसाधन के भीतर एक फ़ाइल पेस्ट कर सकते हैं।
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);
}