Widzę, że istnieją pewne sposoby uzyskania ścieżki folderu aplikacji:
Application.StartupPath
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
AppDomain.CurrentDomain.BaseDirectory
System.IO.Directory.GetCurrentDirectory()
Environment.CurrentDirectory
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
System.IO.Path.GetDirectory(Application.ExecutablePath)
Jaki jest najlepszy sposób w zależności od sytuacji?
IHostEnvironment.ContentRootPath
, dostępną poprzez wstrzykiwanąIHostEnvironment
zależność (która zawiera inne przydatne rzeczy).Odpowiedzi:
AppDomain.CurrentDomain.BaseDirectory
jest prawdopodobnie najbardziej przydatny do uzyskiwania dostępu do plików, których lokalizacja jest względna w stosunku do katalogu instalacyjnego aplikacji.W aplikacji ASP.NET będzie to katalog główny aplikacji, a nie podfolder bin - co jest prawdopodobnie tym, czego zwykle chcesz. W aplikacji klienckiej będzie to katalog zawierający główny plik wykonywalny.
W aplikacji VSTO 2005 będzie to katalog zawierający zestawy zarządzane VSTO dla twojej aplikacji, a nie, powiedzmy, ścieżka do pliku wykonywalnego Excel.
Inne mogą zwracać różne katalogi w zależności od środowiska - na przykład patrz odpowiedź @ Vimvq1987.
CodeBase
to miejsce, w którym plik został znaleziony i może być adresem URL rozpoczynającym się od http: //. W takim przypadkuLocation
prawdopodobnie będzie pamięć podręczna pobierania zestawu. Nie można zagwarantować, że CodeBase zostanie ustawiony dla zestawów w GAC .źródło
Path.Combine
zamiast niego. To zajmie się końcowym ukośnikiem odwrotnym.Application.StartupPath
i 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Działa tylko w przypadku aplikacji Windows FormsSystem.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
Daje ci coś takiego:
"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"
gdzie jest strona, którą prowadzisz.AppDomain.CurrentDomain.BaseDirectory
dla aplikacji internetowej może być przydatna i zwróci coś takiego,"C:\\hg\\Services\\Services\\Services.Website\\"
który jest katalogiem podstawowym i jest całkiem przydatny.System.IO.Directory.GetCurrentDirectory()
i 5.Environment.CurrentDirectory
poda lokalizację, z której został uruchomiony proces - więc dla aplikacji sieci Web działającej w trybie debugowania z Visual Studio coś takiego
"C:\\Program Files (x86)\\IIS Express"
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
dostanie lokalizację, w której
.dll
działa kod, dla aplikacji internetowej, która może być"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
Teraz w przypadku np. Aplikacji konsolowej punktami 2-6 będzie katalog, w którym
.exe
znajduje się plik.Mam nadzieję, że to pozwoli Ci zaoszczędzić trochę czasu.
źródło
Pamiętaj, że nie wszystkie z tych metod zwrócą tę samą wartość. W niektórych przypadkach mogą zwrócić tę samą wartość, ale bądź ostrożny, ich cele są różne:
zwraca
StartupPath
parametr (można ustawić podczas uruchamiania aplikacji)zwraca bieżący katalog, który może, ale nie musi być folderem, w którym znajduje się aplikacja. To samo dotyczy
Environment.CurrentDirectory
. Jeśli używasz tego w pliku DLL, zwróci ścieżkę do miejsca, w którym proces jest uruchomiony (jest to szczególnie prawdziwe w ASP.NET).źródło
GetCurrentDirectory()
, dla miłości biegania z różnych ścieżek! :(W przypadku aplikacji internetowej, aby uzyskać bieżący katalog główny aplikacji sieciowej, zazwyczaj wywołuj stronę WWW dla bieżącego przychodzącego żądania:
Powyższy opis kodu
źródło
Proces rozpocząłem od usługi systemu Windows za pośrednictwem interfejsu Win32 API w sesji od użytkownika, który jest faktycznie zalogowany (w sesji Menedżera zadań 1 nie 0). W ten sposób możemy dowiedzieć się, która zmienna jest najlepsza.
Dla wszystkich 7 przypadków z powyższego pytania wyniki są następujące:
Być może jest to pomocne dla niektórych z was, robiąc te same rzeczy, gdy szukacie najlepszej zmiennej dla swojego przypadku.
źródło
Z mojego doświadczenia wynika, że najlepszym sposobem jest połączenie ich.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Otrzymasz folder binDirectory.GetCurrentDirectory()
Działa dobrze na .Net Core, ale nie .Net i daje katalog główny projektuSystem.AppContext.BaseDirectory
iAppDomain.CurrentDomain.BaseDirectory
Działa dobrze w .Net, ale nie w .Net core i daje katalog główny projektuW bibliotece klas, która ma być target.Net i .Net core, sprawdzam, który szkielet obsługuje bibliotekę i wybieram jedną lub drugą.
źródło
Użyłem tego z powodzeniem
Działa nawet wewnątrz Linqpada.
źródło
Katalog główny:
źródło
Jeśli wiesz, jak uzyskać katalog główny:
źródło
ten
System.IO.Path.GetDirectory(Application.ExecutablePath)
zmienił się naSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)
źródło