Il modo migliore per ottenere il percorso della cartella dell'applicazione


515

Vedo che ci sono alcuni modi per ottenere il percorso della cartella dell'applicazione:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

Qual è il modo migliore a seconda della situazione?


9
Perché abbiamo molti modi per ottenere il percorso dell'applicazione. Penso che ci sia una ragione per ogni modo.
Leo Vo,

1
C'è un errore in # 6: dovrebbe leggere: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
BillW

2
evviva il numero 6, mentre sono in un progetto web, non volevo la logica Server.MapPath nella mia libreria caricata IoC che non è di natura specifica per il web
bkwdesign

1
Ora abbiamo l'affidabile IHostEnvironment.ContentRootPath, accessibile attraverso una IHostEnvironmentdipendenza iniettata (che contiene altre cose utili).
Timo

Risposte:


519

AppDomain.CurrentDomain.BaseDirectory è probabilmente il più utile per accedere ai file la cui posizione è relativa alla directory di installazione dell'applicazione.

In un'applicazione ASP.NET, questa sarà la directory principale dell'applicazione, non la sottocartella bin - che è probabilmente ciò che si desidera di solito. In un'applicazione client, sarà la directory contenente l'eseguibile principale.

In un'applicazione VSTO 2005, sarà la directory che contiene gli assembly gestiti VSTO per l'applicazione, non, per esempio, il percorso dell'eseguibile di Excel.

Gli altri possono restituire directory diverse a seconda dell'ambiente, ad esempio vedere la risposta di @ Vimvq1987.

CodeBaseè il luogo in cui è stato trovato un file e può essere un URL che inizia con http: //. Nel qual caso Locationsarà probabilmente la cache di download dell'assembly. CodeBase non è garantito per essere impostato per gli assembly nel GAC .


2
Durante il test in Windows XP a 32 bit, ritorna da dove è iniziato il collegamento.
Joshua Son,

1
+1 @Joe e per il componente aggiuntivo VSTO a livello di documento vedere QUESTO

3
Essere consapevoli del fatto che questo restituisce un percorso con una barra rovesciata alla fine. Ciò mi ha causato problemi durante la formattazione di una stringa con il risultato da passare come argomento di processo.
avenmore,

19
@avenmore - Se stai formattando una stringa per creare un percorso, considera Path.Combineinvece l' uso . Questo si occuperà della barra rovesciata finale per te.
Joe,

1
Questo sta restituendo la cartella bin / debug per me in VS 2017, non la directory principale.
SmoveBB,

86
  1. Application.StartupPathe 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- Funzionerà solo per l' applicazione Windows Forms

  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)

    Ti darà qualcosa di simile: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"dov'è la pagina che stai correndo.

  3. AppDomain.CurrentDomain.BaseDirectorypoiché l'applicazione Web potrebbe essere utile e restituirà qualcosa come la "C:\\hg\\Services\\Services\\Services.Website\\"directory di base ed è abbastanza utile.

  4. System.IO.Directory.GetCurrentDirectory() e 5. Environment.CurrentDirectory

ti fornirà la posizione da cui è stato avviato il processo, quindi per l'app Web in esecuzione in modalità debug da Visual Studio qualcosa del genere "C:\\Program Files (x86)\\IIS Express"

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

ti porterà dove si .dlltrova il codice, per l'app Web che potrebbe essere"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

Ora, ad esempio, nel caso dell'app console, i punti 2-6 saranno la directory in cui si .exe trova il file.

Spero che questo ti faccia risparmiare un po 'di tempo.


2
Abbastanza sicuro di volere che la "cartella corrente" sia rilevante solo per le app non web ...
Nyerguds

2
Questa è la risposta
P.Brian.Mackey,

59

Si noti che non tutti questi metodi restituiranno lo stesso valore. In alcuni casi, possono restituire lo stesso valore, ma fai attenzione, i loro scopi sono diversi:

Application.StartupPath

restituisce il StartupPathparametro (può essere impostato quando si esegue l'applicazione)

System.IO.Directory.GetCurrentDirectory()

restituisce la directory corrente, che può essere o meno la cartella in cui si trova l'applicazione. Lo stesso vale per Environment.CurrentDirectory. Nel caso in cui lo si stia utilizzando in un file DLL, verrà restituito il percorso di esecuzione del processo (ciò è particolarmente vero in ASP.NET).


7
Per favore, per favore, per favore, non usare GetCurrentDirectory(), per l'amore di correre cose da percorsi diversi! :(
kayleeFrye_onDeck

@kayleeFrye_onDeck non hai indicato i motivi della domanda precedente.
nless l'

10

Per un'applicazione Web, per ottenere la directory radice dell'applicazione Web corrente, in genere chiama per pagina Web la richiesta in arrivo corrente:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Sopra la descrizione del codice


6

Ho avviato un processo da un servizio Windows tramite l'API Win32 nella sessione dell'utente che ha effettivamente effettuato l'accesso (nella sessione Task Manager 1 non 0). In questo è stato possibile sapere quale variabile è la migliore.

Per tutti e 7 i casi dalla domanda precedente, i seguenti sono i risultati:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

Forse è utile per alcuni di voi, facendo le stesse cose, quando cercate la variabile migliore per il vostro caso.


4
Risposta molto pertinente. Così tante persone dimenticano che "directory di lavoro"! = "Directory di programma".
Nyerguds,

3

Nella mia esperienza, il modo migliore è una combinazione di questi.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase Ti darà la cartella bin
  2. Directory.GetCurrentDirectory() Funziona bene su .Net Core ma non su .Net e ti fornirà la directory principale del progetto
  3. System.AppContext.BaseDirectorye AppDomain.CurrentDomain.BaseDirectory Funziona bene in .Net ma non .Net core e ti darà la directory principale del progetto

In una libreria di classi che dovrebbe target.Net e .Net core, controllo quale framework ospita la libreria e scelgo l'una o l'altra.


2

Ho usato questo con successo

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Funziona anche all'interno di linqpad.


1
manca la parentesi di apertura di GetCurrentProcess. tra l'altro valuta C: \ Programmi \ dotnet nel mio progetto core .net durante il debug in Visual Studio perché è lì che si trova
dotnet.exe

1

Root directory:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
Questo sembra ottenere l'attuale directory di lavoro, anche se a volte può essere utile, sicuramente non è garantito che sia il percorso EXE.
krowe2,

0

Se sai di ottenere la directory principale:

string rootPath = Path.GetPathRoot(Application.StartupPath)

0

questo è System.IO.Path.GetDirectory(Application.ExecutablePath)cambiato inSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.