DevelNext – Рабочие директории
Написал небольшую программку, которая хранит конфиги рядом с исполняемым файлом, добавляю её в автозагрузку и… конфигов она не видит
Путь к текущей директории определяется простым кодом:
1 |
realpath('./'); |
У jphp есть свои функции для работы с файловой системой, но результат тот же:
1 |
File::of('./')->getAbsolutePath() |
Собрал тестовый проект, который показывает текущее расположение программы, кидаю на диск D, запускаю:
Отлично, тут всё верно. Теперь пробую запустить из командной строки (так же программа будет запускаться из автозапуска)
1 |
java -jar D:\path.jar |
результат
Т.к. явно не была указана рабочая директория, по умолчанию была выбрана домашняя папка пользователя (для windows – %userprofile%).
Чтоб не зависеть от рабочей директории, можно использовать параметр “java.class.path“, в котором хранятся пути к библиотекам java и архивам jar.
Получить этот путь можно таким образом:
2 |
System::getProperty('java.class.path'); |
Если запустить собранный проект, всё отлично
Если же запустить проект в DevelNext:
Увы, не то, что мы ожидали увидеть. Т.к. программа не собрана, в “java.class.path” находятся отностиельные пути к необходимым библиотекам, родительская директория этих библиотек совпадает с директорией проекта, и поэтому от использования “java.class.path” отказываться не будем.
На основе всего этого получилась функция (нагло спёртая с форума java и переделанная под jPHP):
1 2 3 4 5 6 7 8 9 10 11 12 |
use php\lib\str; use php\lang\System; function getCurrentDir(){ $path = System::getProperty("java.class.path"); $sep = System::getProperty("path.separator"); if(str::contains($path, $sep)){ return dirname(realpath(str::sub($path, 0 , str::pos($path, $sep)))); } else { return dirname($path); } } |
Результат – то, что надо:
Если что, решение кроссплатформенное