Недавно я искал, как получить каталог приложения на Java. Я наконец нашел ответ, но мне потребовалось на удивление много времени, потому что найти такой общий термин непросто. Я думаю, было бы неплохо составить список того, как этого добиться на нескольких языках.
Не стесняйтесь голосовать за / против, если вам (не) нравится идея, и, пожалуйста, внесите свой вклад, если она вам нравится.
Разъяснение:
Существует тонкое различие между каталогом, содержащим исполняемый файл, и текущим рабочим каталогом (указанным pwd
в Unix). Первоначально меня интересовало первое, но не стесняйтесь публиковать методы для определения второго (уточняя, какой из них вы имеете в виду).
language-agnostic
path
Конрад Рудольф
источник
источник
Ответы:
В Java звонки
и
вернуть текущий рабочий каталог.
Призыв к
возвращает путь к JAR-файлу, содержащему текущий класс, или элемент (путь) CLASSPATH, который дал текущий класс, если вы работаете непосредственно из файловой системы.
Пример:
Ваше приложение находится по адресу
Откройте оболочку (cmd.exe) и
cd
перейдите в подкаталог C: \ test \.Запустите приложение с помощью команды
java -jar C:\MyJar.jar
.Первые два вызова возвращают 'C: \ test \ subdirectory'; третий вызов возвращает C: \ MyJar.jar.
При запуске из файловой системы, а не из файла JAR, результатом будет путь к корню созданных файлов классов, например
Путь не включает каталоги пакетов для созданных файлов классов.
Полный пример получения каталога приложения без имени файла .jar или соответствующего пути к файлам классов при запуске непосредственно из файловой системы (например, при отладке):
источник
Class.getResource()
, для чего.В .NET (C #, VB,…) вы можете запросить текущий
Assembly
экземплярLocation
. Однако к нему добавлено имя исполняемого файла. Следующий код очищает путь (using System.IO
иusing System.Reflection
):В качестве альтернативы вы можете использовать информацию, предоставленную
AppDomain
для поиска сборок, на которые имеются ссылки:VB позволяет использовать другой ярлык через
My
пространство имен:источник
В Windows используйте функцию WinAPI GetModuleFileName () . Передайте NULL для дескриптора модуля, чтобы получить путь к текущему модулю.
источник
Python
Это получает путь к текущему модулю.
источник
Objective-C Cocoa (Mac OS X, я не знаю особенностей iPhone):
источник
В Java есть два способа найти путь к приложению. Один из них - использовать
System.getProperty
:Другая возможность - использование
java.io.File
:Еще одна возможность использует отражение:
источник
C:\Program Files\ExampleApp
представлен в форме URL какfile:/C:/Program%20Files/ExampleApp
, для которого возвращает getPath ()"/C:/Program%20Files/ExampleApp"
, которого явно не существует. Единственный правильный способ преобразовать URL-адрес в файл - этоnew File(url.toURI())
.В VB6 вы можете получить путь к приложению, используя
App.Path
свойство.Обратите внимание, что это не будет завершаться
\
ИСКЛЮЧЕНИЕМ, когда приложение находится в корне диска.В среде IDE:
источник
В .Net вы можете использовать
System.IO.Directory.GetCurrentDirectory
чтобы получить текущий рабочий каталог приложения, а в VB.NET, в частности, вы можете использовать
My.Application.Info.DirectoryPath
чтобы получить каталог exe.
источник
Delphi
В приложениях Windows:
В консольных приложениях:
Независимо от языка, первым параметром командной строки является полное имя исполняемого файла:
источник
Libc в
среде типа * nix (также Cygwin в Windows):
См. Страницу руководства
источник
Unix
В unix можно найти путь к исполняемому файлу, который был запущен с использованием переменных среды. Это не обязательно абсолютный путь, поэтому вам нужно будет объединить текущий рабочий каталог (в оболочке
pwd
:) и / или переменную PATH со значением 0-го элемента среды.Однако значение ограничено в unix, так как исполняемый файл может, например, вызываться через символическую ссылку, и только начальная ссылка используется для переменной среды. В целом приложения в unix не очень надежны, если они используют это для каких-либо интересных вещей (например, для загрузки ресурсов). В unix обычно используются жестко запрограммированные местоположения для вещей, например файл конфигурации, в
/etc
котором указаны местоположения ресурсов.источник
В bash команда 'pwd' возвращает текущий рабочий каталог.
источник
pwd
возвращает текущий рабочий каталог, который может отличаться от пути скрипта.В PHP :
источник
в Android это
чтобы получить SD-карту, я использую
где последний используется для хранения определенного типа файла (аудио / фильмы и т. д.). У вас есть константы для этих строк в классе Environment.
По сути, для всего, что связано с приложением, используйте класс ApplicationInfo и для всего, что связано с данными на SD-карте / внешнем каталоге, используя класс Environment.
Документы: ApplicationInfo , Environment
источник
В Tcl
Путь к текущему скрипту:
Путь к оболочке Tcl:
Если вам нужен каталог любого из них, выполните:
Получить текущий (рабочий) каталог:
источник
Ява:
На всех системах (Windows, Linux, Mac OS X) у меня работает только это:
источник
в Ruby следующий фрагмент кода возвращает путь к текущему исходному файлу:
источник
В CFML есть две функции для доступа к пути скрипта:
Вызов getBaseTemplatePath возвращает путь к «базовому» сценарию, то есть к тому, который был запрошен веб-сервером.
Вызов getCurrentTemplatePath возвращает путь к текущему сценарию, то есть к тому, который в данный момент выполняется.
Оба пути являются абсолютными и содержат полный каталог + имя файла сценария.
Чтобы определить только каталог, используйте функцию
getDirectoryFromPath( ... )
по результатам.Итак, чтобы определить местоположение приложения в каталоге, вы можете:
Внутри
onApplicationStart
мероприятия для вашегоApplication.cfc
Чтобы определить путь, по которому находится сервер приложений, на котором запущен ваш механизм CFML, вы можете получить доступ к командам оболочки с помощью cfexecute, поэтому (учитывая вышеупомянутые обсуждения pwd / etc) вы можете сделать:
Unix:
для Windows создайте
pwd.bat
содержащий текст@cd
, затем:(Используйте
variable
атрибутcfexecute
для сохранения значения вместо вывода на экран.)источник
В cmd (оболочка командной строки Microsoft)
Вы можете получить имя скрипта с помощью% * (может быть относительно pwd)
Это получает каталог сценария:
Если вы обнаружите какие-либо ошибки, вы их найдете. Тогда исправьте или прокомментируйте.
источник
Я выпустил https://github.com/gpakosz/whereami, который решает проблему на C и дает вам:
Он используется
GetModuleFileNameW
в Windows, анализирует/proc/self/maps
в Linux и Android и использует_NSGetExecutablePath
илиdladdr
на Mac и iOS.источник
Примечание к ответу «20 выше только для Mac OSX: если исполняемый файл JAR преобразован в« приложение »через OSX JAR BUNDLER, то getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (); НЕ вернет текущий каталог приложения, но добавит в ответ внутреннюю структуру каталогов приложения. Эта внутренняя структура приложения - это / theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile
Возможно, это небольшая ошибка в Java. В любом случае, чтобы получить правильный ответ, нужно использовать один или два метода, и оба дадут правильный ответ, даже если приложение запущено, например, через ярлык, расположенный в другой папке или на рабочем столе.
Карл
SoundPimp.com
источник