Cum pot găsi aplicarea's cale într-o aplicație consolă?
În Windows Forms, pot folosi Aplicația.StartupPath` pentru a găsi calea de curent, dar acest lucru nu't par să fie disponibile într-o aplicație consolă.
Sistem.Reflecție.De asamblare.GetExecutingAssembly()`.Locație
1
Combina asta cu de Sistem.IO.Calea.GetDirectoryName
dacă tot ce vrei este directorul.
1Ca pe Domnul Mindor's comentariu:
Sistemul.Reflecție.De asamblare.GetExecutingAssembly().Locație
se întoarce de unde executare de asamblare se află în prezent, care poate sau nu poate fi în cazul în care ansamblul este situat cand nu executa. În caz de umbra copierea ansambluri, veți obține o cale într-un temp directory. Sistem.Reflecție.De asamblare.GetExecutingAssembly().CodeBase` va returna 'permanent' calea de asamblare.
Aveți două opțiuni pentru a găsi directorul de aplicație, pe care l-ați ales va depinde de scopul dumneavoastră.
// 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);
Probabil, un pic mai târziu, dar aceasta este în valoare de o mențiune:
Environment.GetCommandLineArgs()[0];
Sau mai corect pentru a obține doar calea de director:
System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Edit:
Destul de puțini oameni au subliniat că GetCommandLineArgs
nu este garantat de a reveni la numele programului. A se vedea primul cuvânt De pe linia de comandă este numele programului numai prin convenție. Articolul afirma ca "Deși extrem de puține programe Windows folosi acest capriciu (eu sunt conștient de mine însumi)". Deci, este posibil pentru a 'spoof' GetCommandLineArgs
, dar vorbim despre o aplicație consolă. Consola de aplicații sunt, de obicei, rapid și murdar. Deci, acest lucru se potrivește cu SĂRUTUL meu filosofie.
Pentru oricine este interesat în asp.net aplicații web. Aici sunt rezultatele mele de 3 metode diferite
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);
}
rezultatul
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
aplicația este fizic de funcționare de la "C:\inetpub\SBSPortal_staging", deci, prima soluție este cu siguranta nu este adecvat pentru aplicații web.
Raspunsul de mai sus a fost de 90% de ceea ce am nevoie, dar a revenit un Uri în loc de regulat calea pentru mine.
Așa cum sa explicat în MSDN forumuri post, Cum pentru a converti cale URI la normal filepath?am folosit următoarele:
// Get normal filepath of this assembly's permanent directory
var path = new Uri(
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
).LocalPath;
Pentru Aplicații Consolă, puteți încerca acest lucru:
System.IO.Directory.GetCurrentDirectory();
De ieșire (pe mașina locală):
c:\users\xxxxxxx\documents\visual studio 2012\Proiecte\ImageHandler\GetDir\bin\Debug
Sau poti incerca (nu's o suplimentare de backslash în final):
AppDomain.CurrentDomain.BaseDirectory
Ieșire:
c:\users\xxxxxxx\documents\visual studio 2012\Proiecte\ImageHandler\GetDir\bin\Debug\
Dacă sunteți în căutarea pentru un .NET Core mod compatibil, utilizați
System.AppContext.BaseDirectory
Acest lucru a fost introdus în .NET Framework 4.6 și .NET Core 1.0 (și .NET Standard 1.3). A Se Vedea: AppContext.BaseDirectory Proprietate.
Potrivit această pagină,
Acest lucru este preferat de înlocuire pentru AppDomain.CurrentDomain.BaseDirectory în .NET Core
Eu am folosit
System.AppDomain.CurrentDomain.BaseDirectory
atunci când vreau să găsesc o cale relativă la o folderul aplicații. Aceasta funcționează atât pentru ASP.Net și winform aplicații. De asemenea, nu are nevoie de nici o referire la Sistem.Web ansambluri.
Puteți pur și simplu adăugați la proiect referințe Sistem.Windows.Forme și apoi utilizați Sistemul.Windows.Forme.Aplicație.StartupPath` ca de obicei .
Deci, nu este nevoie de mai multe metode complicate sau folosind reflecție.
Următoarea linie va oferi o cale aplicare:
var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
Soluția de mai sus este de lucru în mod corespunzător în următoarele situații:
mkbundle
pachete (fără alte metode de munca)Adică, de ce să nu o p/invoke?
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());
}
}
}
Ai folosi-o doar ca Aplicația.StartupPath:
Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
Adunarea.GetEntryAssembly().Locație " sau " de Asamblare.GetExecutingAssembly().Locație
Utilizarea în combinație cu Sistemul.IO.Calea.GetDirectoryName()` pentru a obține doar directorul.
Căile de GetEntryAssembly () " și " GetExecutingAssembly()` pot fi diferite, chiar dacă pentru cele mai multe cazuri, directorul va fi la fel.
Cu GetEntryAssembly()trebuie să fie conștienți de faptul că acest lucru poate reveni
nulldacă intrarea modulului este unmanaged (de exemplu C++ sau VB6 executabil). În aceste cazuri este posibil să se utilizeze
GetModuleFileName din Win32 API:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
Nici una dintre aceste metode de lucru în cazuri speciale cum ar fi utilizarea unui link simbolic la exe, ei vor reveni la locul de link-ul nu real exe.
Deci pot folosi [QueryFullProcessImageName][1] pentru a obține în jurul valorii de faptul că:
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) + @"\";
}
}
[1]: https://msdn.microsoft.com/en-us/library/ms684919(v=vs. 85).aspx