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

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

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

Разъяснение:

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

Ответ 1

В Java вызовы

System.getProperty("user.dir")

и

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

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

Вызов

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

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

Пример:

  • Ваша заявка находится в

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

  • Запустите приложение, используя команду java -jar C:\MyJar.jar.

  • Первые два вызова возвращают '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

Ответ 2

В .NET(С#, 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

Ответ 3

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

Ответ 4

Python

path = os.path.dirname(__file__)

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

Ответ 5

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

NSString * applicationPath = [[NSBundle mainBundle] bundlePath];

Ответ 6

В Java существует два способа найти путь к программе. Один из них - использовать System.getProperty:

System.getProperty("user.dir");

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

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

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

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

Ответ 7

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

System.IO.Directory.GetCurrentDirectory

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

My.Application.Info.DirectoryPath

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

Ответ 8

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

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

В среде IDE:

?App.Path
C:\Program Files\Microsoft Visual Studio\VB98

Ответ 9

Delphi

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

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

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

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

Unit System;
path := ExtractFilePath(ParamStr(0));

Ответ 10

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);

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

Ответ 11

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

Ответ 12

Unix

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

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

Ответ 13

В Tcl

Путь текущего script:

set path [info script]

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

set path [info nameofexecutable]

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

set dir [file dirname $path]

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

set dir [pwd]

Ответ 14

В 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 configuration file.
  echo getcwd(); //will return the current working directory (it may differ from the current script location).
?>

Ответ 15

в Android

getApplicationInfo().dataDir;

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

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

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

В принципе, для чего-либо с приложением используйте класс ApplicationInfo и для чего-либо, связанного с данными в SD-карте/External Directory, используя класс среды.

Документы: ApplicationInfo, Environment

Ответ 16

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

path = File.dirname(__FILE__)

Ответ 17

В CFML существуют две функции для доступа к пути script:

getBaseTemplatePath()
getCurrentTemplatePath()

Вызов getBaseTemplatePath возвращает путь "base" script - то есть тот, который был запрошен веб-сервером.
Вызов getCurrentTemplatePath возвращает путь к текущему script - то есть к выполняемому в данный момент.

Оба пути являются абсолютными и содержат полный каталог + имя файла script.

Чтобы определить только каталог, используйте функцию getDirectoryFromPath( ... ) для результатов.

Итак, чтобы определить расположение каталога приложения, вы можете сделать:

<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />

Внутри события onApplicationStart для вашего Application.cfc



Чтобы определить путь, на котором работает сервер приложений, на котором запущен ваш CFML-модуль, вы можете получить доступ к командам оболочки с помощью cfexecute, поэтому (имея в виду выше обсуждения на pwd/etc), вы можете сделать:

Unix:

<cfexecute name="pwd"/>

для Windows, создайте pwd.bat содержащий текст @cd, а затем:

<cfexecute name="C:\docume~1\myuser\pwd.bat"/>

(Используйте variable атрибут cfexecute для сохранения значения вместо вывода на экран.)

Ответ 18

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

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

Это получает каталог script:

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

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

Ответ 19

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

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

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

Ответ 20

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;
}

Ответ 21

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

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

Карл

SoundPimp.com