Najlepszy sposób na uzyskanie ścieżki folderu aplikacji

Widzę, że jest kilka sposobów na uzyskanie ścieżki do folderu aplikacji:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

Jaki jest najlepszy sposób w zależności od sytuacji?

 370
Author: Peter Mortensen, 2011-05-18

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.

 407
Author: Joe,
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).

 50
Author: Vimvq1987,
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
  1. Application.StartupPathi 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) - będzie działać tylko dla aplikacji Windows Forms

  2. 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.

  3. 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.

  4. 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"

  1. 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.

Mam nadzieję, że zaoszczędzisz trochę czasu.
 45
Author: Matas Vaitkevicius,
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;

Powyższy opis kodu

 6
Author: Raj kumar,
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.

 1
Author: Beetee,
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)

 0
Author: nazim hatipoglu,
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:

  1. Przycisk: [Nazwa - 'btn_OpenFile']
  2. Mam abc.exe', który chcę otworzyć.
  3. Ścieżka Do Pliku: C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.

Więc zrobię co następuje:

  1. 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.

 0
Author: Keyur Sureliya,
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.

 0
Author: camilohe,
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