c# Come posso ottenere il percorso dell'applicazione in un'applicazione console .NET?




13 Answers

È possibile utilizzare il seguente codice per ottenere la directory dell'applicazione corrente.

AppDomain.CurrentDomain.BaseDirectory
c# .net console console-application

Come trovo il percorso dell'applicazione in un'applicazione console?

In Windows Form , posso usare Application.StartupPath per trovare il percorso corrente, ma questo non sembra essere disponibile in un'applicazione console.




Probabilmente un po 'tardi, ma vale la pena menzionarlo:

Environment.GetCommandLineArgs()[0];

O più correttamente per ottenere solo il percorso della directory:

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

Modificare:

Molte persone hanno sottolineato che GetCommandLineArgs non è garantito per restituire il nome del programma. Vedi La prima parola sulla riga di comando è il nome del programma solo per convenzione . L'articolo afferma che "Sebbene pochissimi programmi Windows usino questo strano capriccio (non ne sono a conoscenza nemmeno io)". Quindi è possibile "spoofare" GetCommandLineArgs , ma stiamo parlando di un'applicazione console. Le app della console sono in genere veloci e sporche. Quindi questo si adatta alla mia filosofia KISS.




La risposta sopra era il 90% di ciò di cui avevo bisogno, ma per me ha restituito un Uri invece di un percorso regolare.

Come spiegato nel post dei forum MSDN, Come convertire il percorso URI in normale filepath? , Ho usato il seguente:

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



Per le applicazioni console, puoi provare questo:

System.IO.Directory.GetCurrentDirectory();

Uscita (sulla mia macchina locale):

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

Oppure puoi provare (c'è un backslash aggiuntivo alla fine):

AppDomain.CurrentDomain.BaseDirectory

Produzione:

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




Ho usato questo codice e ottenere la soluzione.

AppDomain.CurrentDomain.BaseDirectory



ho usato

System.AppDomain.CurrentDomain.BaseDirectory

quando voglio trovare un percorso relativo a una cartella di applicazioni. Questo funziona sia per ASP.Net che per le applicazioni Winform. Inoltre, non richiede alcun riferimento agli assembly System.Web.




Voglio dire, perché non metodo ap / 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());
                }
            }
    }

Lo useresti proprio come Application.StartupPath:

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



Assembly.GetEntryAssembly().Location o Assembly.GetExecutingAssembly().Location

Utilizzare in combinazione con System.IO.Path.GetDirectoryName() per ottenere solo la directory.

I percorsi da GetEntryAssembly() e GetExecutingAssembly() possono essere diversi, anche se per la maggior parte dei casi la directory sarà la stessa.

Con GetEntryAssembly() devi essere consapevole che questo può restituire null se il modulo entry non è gestito (es. GetEntryAssembly() C ++ o VB6). In questi casi è possibile utilizzare GetModuleFileName dall'API Win32:

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



in VB.net

My.Application.Info.DirectoryPath

funziona per me (Application Type: Class Library). Non sono sicuro di C # ... Restituisce il percorso w / o Nome file come stringa




Prova questa semplice riga di codice:

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



Non ho visto nessuno convertire il LocalPath fornito da .Net Core reflection in un percorso System.IO utilizzabile, ecco la mia versione.

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

   return new FileInfo(exePath).DirectoryName;

}

Ciò restituirà il percorso completo "C: \ xxx \ xxx" in cui si trova il codice.




Puoi usare il seguente codice, otterrai il percorso completo dell'applicazione:

 class Program
{
    static void Main(string[] args)
    {
        string AppPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
        WriteLine($"ApplicationPath ---{AppPath}");
        //OutPut// //ApplicationPath---C:\Users\TestUser\source\repos\ThreadStack\ThreadStack\bin\Debug\ThreadStack.exe
        ReadLine();
    }
}  



È possibile creare un nome di cartella come Risorse all'interno del progetto utilizzando Esplora soluzioni, quindi è possibile incollare un file all'interno delle risorse.

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





Related