Najlepszy sposób na uzyskanie ścieżki folderu aplikacji
Widzę, że jest kilka sposobów na uzyskanie ścieżki do 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?
8 answers
AppDomain.CurrentDomain.BaseDirectory
jest prawdopodobnie najbardziej przydatny do uzyskiwania dostępu do plików, których lokalizacja jest względna do katalogu instalacyjnego aplikacji.
W ASP.NET aplikacja, będzie to główny katalog aplikacji, a nie podfolder bin - który prawdopodobnie jest 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 zarządzane zespoły 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
jest miejscem, w którym znaleziono plik i może być adresem URL zaczynającym się od http://. W takim przypadku Location
będzie prawdopodobnie Cache pobierania assembly. Nie gwarantuje się, że baza kodowa będzie ustawiona dla zestawów w GAC.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-19 11:51:55
Zauważ, że nie wszystkie z tych metod zwrócą tę samą wartość. W niektórych przypadkach mogą zwrócić tę samą wartość, ale uważaj, ich cele są różne:
Application.StartupPath
Zwraca parametr StartupPath
(można ustawić podczas uruchamiania aplikacji)
System.IO.Directory.GetCurrentDirectory()
Zwraca bieżący katalog, który może 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).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-19 11:54:01
Application.StartupPath
i 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- będzie działać tylko dla aplikacji Windows Forms-
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
Da ci coś w stylu:
"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 webowej może być przydatne i zwróci coś w rodzaju"C:\\hg\\Services\\Services\\Services.Website\\"
, który jest katalogiem bazowym i jest bardzo przydatny.System.IO.Directory.GetCurrentDirectory()
i 5.Environment.CurrentDirectory
Da ci lokalizację, gdzie proces został zwolniony z-więc dla aplikacji webowej działającej w trybie debugowania z Visual Studio coś w rodzaju "C:\\Program Files (x86)\\IIS Express"
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
Dostanie ci miejsce, gdzie .dll
jest uruchomiony kod, dla aplikacji internetowej, która może być "file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
Teraz w przypadku np. aplikacji konsolowej punkty 2-6 będą katalogami, w których znajduje się plik .exe
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 10:31:13
Dla aplikacji webowej, aby uzyskać bieżący katalog główny aplikacji webowej, zazwyczaj wywołaj przez stronę internetową dla bieżącego przychodzącego żądania:
HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-19 11:55:31
Rozpocząłem proces z usługi Windows przez Win32 API w sesji od użytkownika, który jest rzeczywiście zalogowany(w sesji Menedżera zadań 1 Nie 0). W tym miejscu możemy dowiedzieć się, która zmienna jest najlepsza.
Dla wszystkich 7 przypadków z powyższego pytania, wyniki są następujące:
Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram
Być może jest to pomocne dla niektórych z was, robiąc te same rzeczy, gdy szukacie najlepszej zmiennej dla swojego przypadku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 19:36:08
Ten "System.IO.Path.GetDirectory(Application.ExecutablePath)" zmienił się na System. IO.Path.GetDirectoryName(Application. ExecutablePath)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-08 20:31:59
Jako Przykład:
- Przycisk: [Nazwa - '
btn_OpenFile
']
Mam abc.exe', który chcę otworzyć.
- Ścieżka Do Pliku:
C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.
Więc zrobię co następuje:
- W przycisku kliknij Zdarzenie:
btn_OpenFile_Click()
Process.Start(@Environment.CurrentDirectory+"\\..\\..\\abc.exe");
Uwaga: "Środowisko.CurrentDirectory " return this path: "C:\\Users\\Admin\\Documents\\Visual Studio 2015\\Projects\\MyProject\\MyProject\\bin\\Debug"
Więc, umieszczając "\\.."
to, możesz przejść do wyższego katalogu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-16 06:49:05
Używałem tego z powodzeniem
System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
Działa nawet wewnątrz linqpad.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 20:02:06