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

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

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

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

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

В Java вызовы

 System.getProperty("user.dir") 

а также

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

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

Призыв к

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

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

Пример:

  1. Ваша заявка находится по адресу

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

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

  4. Первые два вызова возвращают ‘C: \ test \ subdirectory’; третий вызов возвращает «C: \ MyJar.jar».

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

 c:\eclipse\workspaces\YourProject\bin\ 

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

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

 String applicationDir = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); if (applicationDir.endsWith(".jar")) { applicationDir = new File(applicationDir).getParent(); } // else we already have the correct answer 

В .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 

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

питон

 path = os.path.dirname(__file__) 

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

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

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

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

 System.getProperty("user.dir"); 

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

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

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

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

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

Обратите внимание, что это не будет иметь trailing \ EXCEPT, если приложение находится в корне диска.

В среде IDE:

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

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

System.IO.Directory.GetCurrentDirectory

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

My.Application.Info.DirectoryPath

для получения каталога exe.

Delphi

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

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

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

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

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

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

  #include  char *getcwd(char *buf, size_t size); char *getwd(char *buf); //deprecated char *get_current_dir_name(void); 

Просмотреть страницу руководства

Юникс

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

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

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

В PHP :

  

в Android

 getApplicationInfo().dataDir; 

для получения SD-карты я использую

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

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

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

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

В Tcl

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

 set path [info script] 

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

 set path [info nameofexecutable] 

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

 set dir [file dirname $path] 

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

 set dir [pwd] 

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

 path = File.dirname(__FILE__) 

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

 getBaseTemplatePath() getCurrentTemplatePath() 

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

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

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

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

  

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


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

Unix:

  

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

  

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

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

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

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

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

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

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

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

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

Ява:

На всех системах (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; } 

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

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

деревенщина

SoundPimp.com

  • GOTO по-прежнему считается вредным?
  • Синглтоны: хороший дизайн или костыль?
  • Нужна помощь по mod 1000000007 вопросам
  • Когда бросать исключение?
  • В каких ситуациях используется восьмеричная база?
  • Шаблоны проектирования: абстрактный завод по сравнению с заводским методом
  • Можете ли вы объяснить шаблон дизайна контекста?
  • Почему переменные «i» и «j» используются для счетчиков?
  • Есть ли алгоритм для смешивания цветов, который работает как смешивание реальных цветов?
  • Какой смысл ООП?
  • Должен ли я тестировать частные методы или только публичные?
  • Давайте будем гением компьютера.