2009-06-02 11 views

Odpowiedz

280

One:

System.AppDomain.CurrentDomain.BaseDirectory 

Innym sposobem na to byłoby:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName) 
+0

Ah, dzięki. Musiał jakoś przeoczyć AppDomain. Szukałem tego, właściwie ... – Joey

+0

Nie wydaje się być dostępny w VS.Net 2010/WPF 4 – AndyD273

+0

@ AndyD273: Działa dla mnie. Brakuje dyrektywy "using" lub odwołania do zespołu? – Helen

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName; 
string dir = Path.GetDirectoryName(exePath); 

Spróbuj tego! Metoda

+0

Nie ładna, ale działa. Dzięki :-) – Joey

24

Oto kolejny:

System.Reflection.Assembly.GetExecutingAssembly().Location 
+1

Ten uzyskuje lokalizację po _shadow-copying_, jak podano [w dokumentacji] (http: // msdn.microsoft.com/en-us/library/system.reflection.assembly.location.aspx). W rzeczywistości nie jestem pewien, czy sugestie przyjęte w odpowiedzi mają wpływ na kopiowanie w tle. –

+2

Dało mi to podkatalog biblioteki DLL, do której dzwoniłem, a nie główny katalog programu. – strattonn

7

Można także użyć pierwszego argumentu polecenia argumenty liniowe:

String exePath = System.Environment.GetCommandLineArgs()[0]

+0

Należy jednak zauważyć, że aplikacja "zła" może modyfikować argumenty wiersza poleceń. –

+0

@Daniel: Dlaczego miałby to zrobić sam? Czy masz na myśli inną aplikację? –

+1

@Merlyn: Zobacz http://blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx cytuję: jest to "wygodnie zainicjowany parametr do kodu startowego procesu". Możesz więc celowo lub nieumyślnie zmodyfikować tę lokalizację pamięci. –

0

Możesz również swobodnie używać Application.StartupPath z System.Windows.Forms, ale musisz dodać odniesienie do zestawu System.Windows.Forms!

3

Spróbuj tego. Nie zapomnij o using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
1

Użyłem po prostu string baseDir = Environment.CurrentDirectory; i jego pracy dla mnie.

Powodzenia

Edit:

użyłem, aby usunąć tego rodzaju pomyłki ale wolę ją edytować, ponieważ myślę, że punkt na minus ta odpowiedź pomóc ludziom wiedzieć o niewłaściwy sposób. :) Mam rozumieć powyższe rozwiązanie nie jest przydatny i zmieniłem go string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Inne sposoby, aby dostać go to:

1. string baseDir = 
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
2. String exePath = System.Environment.GetCommandLineArgs()[0]; 
3. string appBaseDir = System.IO.Path.GetDirectoryName 
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); 

Powodzenia

+3

To jest bieżący katalog roboczy. To * może * zbiegać się z katalogiem aplikacji, ale są to oddzielne pojęcia (i co najważniejsze, katalog roboczy może się zmienić, np. Jeśli miałeś otwarte wspólne okno dialogowe plików). – Joey

+1

@joey masz rację. Zmieniłem go na: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Dzięki. – QMaster

0

Próbowałem to:

label1.Content = Directory.GetCurrentDirectory(); 

i uzyskać także katalog.

+0

Otrzymuje bieżący katalog roboczy, który może być różny od katalogu procesu. – Thraka

+0

Chyba muszę ocenić Directory.GetCurrentDirectory(); jeszcze. Dziękuję @Thraka za korektę. – paul