Получить путь к приложению - PullRequest
79 голосов
/ 20 октября 2008

Я недавно искал, как получить каталог приложения на Java. Я наконец нашел ответ, но мне понадобилось на удивление много времени, потому что поиск такого общего термина не прост. Я думаю, что было бы неплохо составить список того, как этого добиться на нескольких языках.

Не стесняйтесь повышать / понижать голос, если вам (не) нравится идея, и , пожалуйста, внесите , если вам это нравится.

Пояснение:

Существует четкое различие между каталогом , который содержит исполняемый файл , и текущим рабочим каталогом (предоставленным pwd в Unix). Первоначально я был заинтересован в первом, но не стесняйтесь публиковать методы для определения последнего (уточняя, какой из них вы имеете в виду).

Ответы [ 21 ]

58 голосов
/ 24 марта 2009

В Java звонки

System.getProperty("user.dir")

и

new java.io.File(".").getAbsolutePath();

возвращает текущий рабочий каталог.

Звонок на

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

возвращает путь к файлу JAR, содержащему текущий класс, или элемент (путь) CLASSPATH, который дал текущий класс, если вы работаете непосредственно из файловой системы.

Пример:

  1. Ваше приложение находится по адресу

     C:\MyJar.jar
    
  2. Откройте оболочку (cmd.exe) и cd в подкаталог C: \ test \.

  3. Запустите приложение с помощью команды java -jar C:\MyJar.jar.

  4. Первые два вызова return 'C: \ test \ subdirectory'; третий вызов возвращает 'C: \ MyJar.jar'.

При запуске из файловой системы, а не из файла JAR, результатом будет путь к корню сгенерированных файлов классов, например

c:\eclipse\workspaces\YourProject\bin\

Путь не включает каталоги пакетов для сгенерированных файлов классов.

Полный пример получения каталога приложения без имени файла .jar или соответствующего пути к файлам классов, если он запускается непосредственно из файловой системы (например, при отладке):

String applicationDir = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 

if (applicationDir.endsWith(".jar"))
{
    applicationDir = new File(applicationDir).getParent();
}
// else we already have the correct answer
22 голосов
/ 20 октября 2008

В .NET (C #, VB,…) вы можете запросить текущий экземпляр Assembly для его Location. Однако к нему добавлено имя файла исполняемого файла. Следующий код очищает путь (using System.IO и using System.Reflection):

Directory.GetParent(Assembly.GetExecutingAssembly().Location)

Кроме того, вы можете использовать информацию, предоставленную AppDomain, для поиска ссылочных сборок:

System.AppDomain.CurrentDomain.BaseDirectory

VB позволяет использовать другой ярлык через пространство имен My:

My.Application.Info.DirectoryPath
9 голосов
/ 20 октября 2008

В Windows , используйте функцию WinAPI GetModuleFileName () . Передайте NULL для дескриптора модуля, чтобы получить путь для текущего модуля.

7 голосов
/ 20 октября 2008

Python

path = os.path.dirname(__file__)

Получает путь к текущему модулю.

5 голосов
/ 24 марта 2009

Objective-C Cocoa (Mac OS X, я не знаю особенностей iPhone):

NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
4 голосов
/ 20 октября 2008

В Java существует два способа найти путь к приложению. Один должен нанять System.getProperty:

System.getProperty("user.dir");

Другой возможностью является использование java.io.File:

new java.io.File("").getAbsolutePath();

Еще одна возможность использует отражение:

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
4 голосов
/ 28 октября 2010

В .Net вы можете использовать

System.IO.Directory.GetCurrentDirectory

для получения текущего рабочего каталога приложения, а в VB.NET, в частности, вы можете использовать

My.Application.Info.DirectoryPath

чтобы получить каталог exe.

4 голосов
/ 31 июля 2012

В VB6 вы можете получить путь к приложению, используя свойство App.Path.

Обратите внимание, что у него не будет завершающего \ ИСКЛЮЧИТЬ, когда приложение находится в корне диска.

В IDE:

?App.Path
C:\Program Files\Microsoft Visual Studio\VB98
3 голосов
/ 20 октября 2008

Delphi

В приложениях Windows:

Unit Forms;
path := ExtractFilePath(Application.ExeName);

В консольных приложениях:

Независимо от языка, первый параметр командной строки - это полное имя исполняемого файла:

Unit System;
path := ExtractFilePath(ParamStr(0));
3 голосов
/ 20 октября 2008

Libc
В среде * nix type (также Cygwin в Windows):

  #include <unistd.h>

   char *getcwd(char *buf, size_t size);

   char *getwd(char *buf); //deprecated

   char *get_current_dir_name(void);

См. Справочную страницу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...