2010-04-07 19 views
13

muszę uzyskać ścieżkę (nie wykonywalny), gdzie moja aplikacja jest uruchomiona od:Plik wykonywalny, z którego uruchamiana jest aplikacja?

System.AppDomain.CurrentDomain.BaseDirectory() 

Kiedy uruchamiam powyższe stwierdzenie z & „/images/image.jpg” na moim komputerze lokalnym działa dobrze ale kiedy instaluję aplikację na innej maszynie, oznacza to, że nie może znaleźć pliku i jest tam wiele dodatkowych informacji o ścieżce.

Potrzebuję tylko katalogu, w którym działa aplikacja. Koduję w VB.NET z Visual Studio 2008.

Dzięki!

+0

Nie wiem zbyt wiele o porównaniu z 2008, ale kiedy robisz dirinfo, nie otrzymasz informacji o tym, gdzie aplikacja się znajduje. biegnie? – Grumpy

+0

Możliwy duplikat ścieżki [Pobierz ścieżkę programów?] (Http://stackoverflow.com/questions/2216141/get-programs-path) –

Odpowiedz

26
Dim strPath As String = System.IO.Path.GetDirectoryName(_ 
    System.Reflection.Assembly.GetExecutingAssembly().CodeBase) 

Zrobione z HOW TO: Determine the Executing Application's Path (MSDN)

+6

strPath zawiera ** plik **: \\ c: \\ xxxxxx – Kraken101

+0

To nie jest bezpieczne, na przykład gdy jest używane do otwierania pliku konfiguracyjnego, powoduje 'System.Configuration.ConfigurationErrorsException: Wystąpił błąd podczas ładowania pliku konfiguracyjnego: Formaty URI nie są obsługiwane " –

+0

Odpowiedź MrCalvina działa dobrze w tym przypadku. –

0

można napisać następujące:

Path.Combine(Path.GetParentDirectory(GetType(MyClass).Assembly.Location), "Images\image.jpg") 
+1

Istnieje wiele pułapek w tym podejściu, ponieważ zbiór niekoniecznie znajduje się w tym samym katalogu co wykonywanie montaż. –

4

Można użyć statycznej StartupPath właściwość klasy Application.

12
Dim P As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase) 
P = New Uri(P).LocalPath 
20

Jest to pierwszy post w Google, więc pomyślałem, że opublikuję różne dostępne sposoby i sposób ich porównania. Niestety nie mogę wymyślić, jak utworzyć tabelę tutaj, więc jest to obraz. Kod każdego z nich znajduje się pod obrazem przy użyciu w pełni kwalifikowanych nazw.

enter image description here

My.Application.Info.DirectoryPath 

Environment.CurrentDirectory 

System.Windows.Forms.Application.StartupPath 

AppDomain.CurrentDomain.BaseDirectory 

System.Reflection.Assembly.GetExecutingAssembly.Location 

System.Reflection.Assembly.GetExecutingAssembly.CodeBase 

New System.UriBuilder(System.Reflection.Assembly.GetExecutingAssembly.CodeBase) 

Path.GetDirectoryName(Uri.UnescapeDataString((New System.UriBuilder(System.Reflection.Assembly.GetExecutingAssembly.CodeBase).Path))) 

Uri.UnescapeDataString((New System.UriBuilder(System.Reflection.Assembly.GetExecutingAssembly.CodeBase).Path)) 
6

Musiałem wiedzieć to i przyszedł tutaj, zanim przypomniałem sobie klasę Środowisko.

Jeśli ktoś inny miał ten problem, po prostu użyj tego: Environment.CurrentDirectory.

Przykład:

Dim dataDirectory As String = String.Format("{0}\Data\", Environment.CurrentDirectory) 

Po uruchomieniu Visual Studio w trybie debugowania yeilds:

C:\Development\solution folder\application folder\bin\debug 

To jest dokładnie zachowanie potrzebowałem, a jego proste i jednoznaczne wystarczy.

+1

Najmniejsze, najłatwiejsze rozwiązanie, z formatowaniem! +1, dziękuję. – rdtsc

+0

Tak, to pomaga uczynić aplikację naprawdę przenośną, zachowując plik ustawień w ścieżce głównej aplikacji. Dzięki za proste rozwiązanie! –

Powiązane problemy