2010-07-17 23 views
5

So che nella stessa directory in cui è in esecuzione il mio codice si trovano alcuni file. Ho bisogno di trovare loro e passare ad un altro metodo:Ottieni la directory in cui si trova il codice eseguito

MyLib.dll 
Target1.dll 
Target2.dll 

Foo(new[] { "..\\..\\Target1.dll", "..\\..\\Target2.dll" }); 

Così mi chiamano System.IO.Directory.GetFiles(path, "*.dll"). Ma ora ho bisogno di conoscere il percorso:

string path = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName) 

ma c'è la via più breve?

+0

[Questo post] (http://stackoverflow.com/questions/3163495/better-way-to-get-the-base-directory) dovrei darti alcune opzioni – mhenrixon

risposta

6

Si può provare la proprietà Environment.CurrentDirectory. Si noti che a seconda del tipo di applicazione (Console, WinForms, ASP.NET, Servizio Windows, ...) e il modo in cui viene eseguito, ciò potrebbe comportarsi in modo diverso.

+0

Sto eseguendo il test NUnit. Nel mondo reale chiamo 'Foo (Server.MapPath (" ~/bin "))' ma nel test voglio solo scansionare la directory principale dell'assembly che contiene il test – abatishchev

+0

Grazie! 'Environment.CurrentDirectory' è quello che stavo cercando. La mia chiamata restituisce qualcosa da Temp ma il tuo - esattamente quello di cui ho bisogno. – abatishchev

+1

Environment.CurrentDirectory non funziona come previsto in ogni momento. Se la tua applicazione accede alla finestra di dialogo standard Apri file di Windows e selezioni un percorso, la prossima chiamata a Environment.CurrentDirectory restituirà l'ultimo percorso selezionato nella finestra di dialogo Apri file invece del percorso del programma in esecuzione. – 10100111001

2

Environment.CurrentDirectory restituisce la directory corrente, non la directory in cui si trova il codice eseguito. Se si utilizza Directory.SetCurrentDirectory o se si avvia il programma utilizzando un collegamento in cui è impostata la directory, questa non sarà la directory che si sta cercando.

Attenersi alla soluzione originale. Nascondere l'implementazione (e renderlo più breve), utilizzando una proprietà:

private DirectoryInfo ExecutingFolder 
{ 
    get 
    { 
     return new DirectoryInfo (
      System.IO.Path.GetDirectoryName (
       System.Reflection.Assembly.GetExecutingAssembly().Location)); 
    } 
} 
Problemi correlati