Получить путь к приложению
Недавно я искал, как получить каталог приложений на 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