Получить путь к приложению

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

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

Уточнение:

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


person Community    schedule 20.10.2008    source источник
comment
Какой путь вы имеете в виду? Текущий рабочий каталог или каталог, в котором находится исполняемый код?   -  person Paul de Vrieze    schedule 20.10.2008


Ответы (20)


В 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. Первые два вызова возвращают '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
person Community    schedule 24.03.2009
comment
Искал способ поместить файлы только для чтения в тот же пакет, что и классы Java... getClass().getProtectionDomain().getCodeSource().getLocation().getPath() отлично сработало, спасибо! - person Fuzzy Analysis; 12.12.2012
comment
@fuzzyanalysis Это именно то, для чего предназначен Class.getResource(). - person user207421; 15.12.2016

В .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
person Community    schedule 20.10.2008
comment
Вы также можете использовать Application.StartupPath для некоторых программ. Однако для ASP.NET это не сработает. - person jocull; 23.01.2011
comment
На самом деле это Application.ExecutablePath - person zam664; 16.03.2012

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

person Community    schedule 20.10.2008

Питон

path = os.path.dirname(__file__)

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

person Community    schedule 20.10.2008

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

NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
person Community    schedule 24.03.2009
comment
В моем приложении Mac OSX я искал фактический путь к исполняемому файлу (для включения в plist) и использовал это: NSString *executablePath = [[NSBundle mainBundle] executablePath]; - есть также версия «executableURL», которая возвращает URL вместо строки - person Todd; 05.05.2012

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

System.getProperty("user.dir");

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

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

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

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
person Community    schedule 20.10.2008
comment
Обратите внимание, что это немного вводит в заблуждение / сбивает с толку. Три метода, которые вы цитируете, могут дать совершенно разные результаты! - person Zarkonnen; 20.10.2008
comment
Зарконнен: Вы правы, но, как следует из моего первоначального поста, я не эксперт. Это вики сообщества. Пожалуйста, не стесняйтесь редактировать / исправлять мой ответ! - person Konrad Rudolph; 20.10.2008
comment
СОВЕТ: Обычно путь указывать не нужно, если вы хотите получить доступ к файлу в текущем рабочем каталоге, например: file = new File(file.cfg); Просто обязательно всегда устанавливайте рабочий каталог в местонахождение вашего приложения во время инициализации или в ярлыке приложения. - person lepe; 14.12.2011
comment
@lepe Не устанавливайте рабочий каталог при запуске, это имеет некоторые нежелательные последствия, такие как указание некоторых диалогов выбора файлов по умолчанию на путь приложения, а не на выбранный пользователем рабочий каталог. - person Konrad Rudolph; 14.12.2011
comment
Две основные проблемы с последним подходом: первая, ProtectionDomain.getCodeSource() может возвращать null. Во-вторых, URL.getPath() не возвращает имя файла, а просто возвращает (возможно, экранированную) часть URL-адреса. C:\Program Files\ExampleApp представлен в форме URL как file:/C:/Program%20Files/ExampleApp, для которого getPath() возвращает "/C:/Program%20Files/ExampleApp", которого, очевидно, не существует. Единственный правильный способ преобразования URL-адреса в файл — new File(url.toURI()). - person VGR; 01.08.2016

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

Обратите внимание, что в конце не будет \, ЗА ИСКЛЮЧЕНИЕМ случаев, когда приложение находится в корневом каталоге диска.

В среде IDE:

?App.Path
C:\Program Files\Microsoft Visual Studio\VB98
person Community    schedule 31.07.2012

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

System.IO.Directory.GetCurrentDirectory

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

My.Application.Info.DirectoryPath

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

person Community    schedule 28.10.2010

Дельфи

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

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

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

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

Unit System;
path := ExtractFilePath(ParamStr(0));
person Community    schedule 20.10.2008

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

  #include <unistd.h>

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

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

   char *get_current_dir_name(void);

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

person Community    schedule 20.10.2008

Юникс

В unix можно найти путь к исполняемому файлу, который был запущен с помощью переменных окружения. Это не обязательно абсолютный путь, поэтому вам нужно будет объединить текущий рабочий каталог (в оболочке: pwd) и/или переменную PATH со значением 0-го элемента среды.

Однако это значение ограничено в unix, поскольку исполняемый файл может быть вызван, например, через символическую ссылку, и только начальная ссылка используется для переменной среды. В общем, приложения в Unix не очень надежны, если они используют это для чего-то интересного (например, для загрузки ресурсов). В Unix принято использовать жестко закодированные местоположения для вещей, например, файл конфигурации в /etc, где указаны местоположения ресурсов.

person Community    schedule 20.10.2008

В bash команда pwd возвращает текущий рабочий каталог.

person Community    schedule 20.10.2008
comment
К сожалению, pwd возвращает текущий рабочий каталог, который может отличаться от пути скрипта. - person Konrad Rudolph; 20.10.2008
comment
Ответ на самом деле можно найти в stackoverflow.com/questions/59895/ - person Konrad Rudolph; 20.10.2008

В PHP:

<?php
  echo __DIR__; //same as dirname(__FILE__). will return the directory of the running script
  echo $_SERVER["DOCUMENT_ROOT"]; // will return the document root directory under which the current script is executing, as defined in the server's configuration file.
  echo getcwd(); //will return the current working directory (it may differ from the current script location).
?>
person Community    schedule 14.12.2011

в Android это

getApplicationInfo().dataDir;

чтобы получить SD-карту, я использую

Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(String type);

где последний используется для хранения файлов определенного типа (аудио/фильмы и т. д.). У вас есть константы для этих строк в классе Environment.

По сути, для всего, что связано с приложением, используйте класс ApplicationInfo, а для всего, что связано с данными на SD-карте/внешнем каталоге, используйте класс Environment.

Документы: Информация о приложении, Среда

person Community    schedule 20.02.2012

В Tcl

Путь текущего скрипта:

set path [info script]

Путь к оболочке Tcl:

set path [info nameofexecutable]

Если вам нужен каталог любого из них, выполните:

set dir [file dirname $path]

Получить текущий (рабочий) каталог:

set dir [pwd]
person Community    schedule 11.08.2010

Java:

На всех системах (Windows, Linux, Mac OS X) у меня работает только это:

public static File getApplicationDir() 
{
    URL url = ClassLoader.getSystemClassLoader().getResource(".");
    File applicationDir = null;
    try {
        applicationDir = new File(url.toURI());
    } catch(URISyntaxException e) {
        applicationDir = new File(url.getPath());
    }

    return applicationDir;
}
person Community    schedule 06.09.2016
comment
Это вызывает NPE, если приложение работает в файле JAR. - person user207421; 15.12.2016

в Ruby следующий фрагмент возвращает путь к текущему исходному файлу:

path = File.dirname(__FILE__)
person Community    schedule 20.10.2008

В cmd (оболочка командной строки Microsoft)

Вы можете получить имя скрипта с помощью %* (может быть относительно pwd)

Это получает каталог скрипта:

set oldpwd=%cd%
cd %0\..
set app_dir=%pwd%
cd %oldpwd%

Если вы найдете какие-либо ошибки, которые вы будете. Тогда исправьте или прокомментируйте.

person Community    schedule 03.07.2012

Я выпустил https://github.com/gpakosz/whereami, который решает проблему на C и дает вам:

  • путь к текущему исполняемому файлу
  • путь к текущему модулю (отличается от пути к исполняемому файлу при вызове из разделяемой библиотеки).

Он использует GetModuleFileNameW в Windows, анализирует /proc/self/maps в Linux и Android и использует _NSGetExecutablePath или dladdr в Mac и iOS.

person Community    schedule 28.01.2015

Примечание к ответу «20 выше только для Mac OSX: если исполняемый файл JAR преобразуется в «приложение» с помощью OSX JAR BUNDLER, то getClass().getProtectionDomain().getCodeSource().getLocation(); НЕ вернет текущий каталог приложения, но к ответу будет добавлена ​​внутренняя структура каталогов приложения.

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

Карл

SoundPimp.com

person Community    schedule 31.01.2012