Ottieni il percorso della cartella corrente


222

Voglio creare un programma che converte i file. Vorrei che l'utente fosse in grado di posizionare il file eseguibile in qualsiasi directory, e quando eseguo quel programma (facendo doppio clic su .exe) voglio che il programma elabori tutti i file nella cartella corrente in cui esiste il file exe . In che modo il programma può determinare il percorso in cui è attualmente in esecuzione?

Ci ho provato System.Windows.Forms.Application.StartupPathma sembra che sia sbagliato.

Qualche idea?

Risposte:


334

Si dovrebbe non usare Directory.GetCurrentDirectory()nel tuo caso, come la directory corrente può differire dalla cartella di esecuzione, in particolare quando si esegue il programma attraverso una scorciatoia.

È meglio usare Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);per il tuo scopo. Ciò restituisce il percorso in cui risiede l'assembly attualmente in esecuzione.

Mentre il mio approccio suggerito ti consente di distinguere tra l'assembly in esecuzione, l'assembly di entrata o qualsiasi altro assembly caricato, come ha affermato Soner Gönül nella sua risposta,

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

può anche essere sufficiente. Questo sarebbe uguale a

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly () e GetExecutingAssembly () ha una differenza interessante. Per i dettagli si rimanda stackoverflow.com/a/18562036/30289
bhadra

3
Come ho detto: restituisce il percorso in cui risiede l' assembly attualmente in esecuzione . La differenza tra GetEntryAssemblye GetExecutingAssemblynon è una sorpresa, è evidente anche dal nome della funzione. Se hanno fatto lo stesso, perché dovrebbero esserci due funzioni? :-)
Thorsten Dittmar l'

2
+1 Assembly.GetEntryAssembly () mi ha aiutato in caso di esecuzione dell'applicazione tramite clickonce
Artiom

9
Questo è in System.Reflection, quindi System.Reflection.Assembly.GetExecutingAssembly().Locationè il completo - se stai testando da Immediate Window
The Red Pea il

147
System.AppDomain.CurrentDomain.BaseDirectory

Questo ti darà la directory corrente della tua applicazione. Funziona anche con le applicazioni web. Successivamente puoi raggiungere il tuo file.


9
Questa è la proprietà più accurata da utilizzare a questo scopo. La BaseDirectory di CurrentDomain punterà sempre alla posizione corretta anche se AppDomain viene creato dinamicamente per guardare gli assembly da una posizione diversa.
Dhruvin,

Perfetto. Funziona in modo indipendente per qualsiasi applicazione, specialmente quando si utilizza Streamreader, che può leggere diversi percorsi assoluti a seconda del tipo di applicazione.
user3326078,

40

Ho creato una semplice applicazione console con il seguente codice:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

Ho copiato l'eseguibile risultante in C:\temp2. Ho quindi inserito un collegamento a quel file eseguibile C:\temp3e l'ho eseguito (una volta dall'exe stesso e una volta dal collegamento). Ha fornito le seguenti uscite entrambe le volte:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

Mentre sono sicuro che ci deve essere qualche motivo per spiegare perché ci sono cinque diversi metodi che fanno praticamente la stessa identica cosa, certamente non so di cosa si tratta. Tuttavia, sembrerebbe che nella maggior parte dei casi, sei libero di scegliere quello che desideri.

AGGIORNAMENTO: ho modificato le proprietà del collegamento, cambiando il campo "Inizia tra:" in C:\temp3. Ciò ha comportato il seguente output:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... che dimostra almeno alcune delle distinzioni tra i diversi metodi.


2
Grazie mille.
baj9032,

Una nota importante La directory di lavoro non sarà sempre la stessa della directory installata.
Giordania,


21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

A partire dal Path.GetDirectoryName

Restituisce le informazioni sulla directory per la stringa di percorso specificata.

A partire dal Application.ExecutablePath

Ottiene il percorso del file eseguibile che ha avviato l'applicazione, incluso il nome dell'eseguibile.


19

Usa questo,

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

Puoi usare anche questo.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

9

per l' uso di .NET CORESystem.AppContext.BaseDirectory

(in sostituzione di AppDomain.CurrentDomain.BaseDirectory)


6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory

Environment.CurrentDirectorypuò essere modificato in diversi modi ... (impostazioni di shotrtcut, ecc.)
Yousha Aleayoub


0

Se vuoi il percorso exe puoi usare System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

Questo funziona meglio per me, soprattutto quando si utilizza la pubblicazione di singoli file core dotnet. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

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.