2013-03-27 17 views
131

Voglio creare un programma che converta i file. Vorrei che l'utente fosse in grado di posizionare il file eseguibile in qualsiasi directory, e quando si esegue quel programma (facendo doppio clic su .exe) voglio che il programma elabori tutti i file all'interno della cartella corrente dove esiste il file exe . Come può il programma determinare il percorso in cui è attualmente in esecuzione?Ottieni percorso cartella corrente

Ho provato System.Windows.Forms.Application.StartupPath ma quello sembra essere il modo sbagliato.

Qualche idea?

risposta

200

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

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

Mentre il mio approccio suggerito permette di differenziare tra il gruppo di esecuzione, l'assemblaggio di entrata o di qualsiasi altro gruppo di carico, come ha detto Soner Gönül nella sua risposta,

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

può anche essere sufficiente. Questo sarebbe pari a

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

GetEntryAssembly() e GetExecutingAssembly() presentano una differenza interessante. Per i dettagli, consultare http://stackoverflow.com/a/18562036/30289 – bhadra

+0

Come ho detto: restituisce il percorso in cui risiede * l'assembly attualmente in esecuzione *. La differenza tra 'GetEntryAssembly' e' GetExecutingAssembly' non è tanto sorprendente, è anche evidente dal nome della funzione. Se hanno fatto lo stesso, perché dovrebbero esserci due funzioni? :-) –

+2

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

12

Utilizzare questo,

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

È possibile utilizzare questo come bene.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
19
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

Da Path.GetDirectoryName

Restituisce le informazioni di directory per la stringa percorso specificato.

Da Application.ExecutablePath

Ottiene il percorso per il file eseguibile che ha avviato l'applicazione, compreso il nome del file eseguibile.

6

1.

Directory.GetCurrentDirectory(); 

2.

Thread.GetDomain().BaseDirectory 

3.

Environment.CurrentDirectory 
64
System.AppDomain.CurrentDomain.BaseDirectory 

Questo vi darà esecuzione della tua applicazione. Questo funziona anche per le applicazioni web. Successivamente puoi raggiungere il tuo file.

+5

Questa è la proprietà più accurata da utilizzare per questo scopo. BaseDirectory di CurrentDomain punta sempre alla posizione corretta anche se l'AppDomain viene creato dinamicamente per visualizzare gli assembly da una posizione diversa. – dhruvin

13

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 il file eseguibile risultante a C:\temp2. Ho quindi inserito un collegamento a quell'eseguibile in C:\temp3 e lo ho eseguito (una volta dall'exe stesso e una volta dal collegamento). Ha dato le seguenti uscite entrambe le volte:

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

Mentre sono sicuro che ci deve essere qualche ragione cockamamie per spiegare il motivo per cui ci sono cinque diversi metodi di che fanno praticamente la stessa cosa, certamente don' so di cosa si tratta Tuttavia, sembrerebbe che nella maggior parte delle circostanze, sei libero di scegliere quale ti piace.

UPDATE: ho modificato le proprietà di scelta rapida, cambiando la "Start In:" campo per C:\temp3. Questo ha portato alla seguente output:

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

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

+0

Grazie mille. – baj9032

Problemi correlati