LINUX.ORG.RU

[JAVA] файл создается не там где надо

 


0

1
File file = new File("perferences");
            file.createNewFile();
            PrintWriter pw = new PrintWriter(file);
            if(c_autohidetb.isSelected()) pw.println("TaskBarAutoHide=1");
            else pw.println("TaskBarAutoHide=0");         
            pw.close();

Вот такой код.. мне нужно чтобы файл создавался в директории с программой, но он сохраняется в домашней папке, почему? В винде все ОК. пробовал File file = new File("./perferences"); таже беда

я так понял нужно установить рабочий каталог.. прогу запускаю не из командной строки а из файлменеджера

pozitiffcat ★★★
() автор топика

Файл создаётся в текущей директории. Видимо при запуске программы именно домашняя директория является текущей. Чтобы файл создавался в директории с программой, нужно как то её узнавать, например при инсталляции сохранять в настройках, или анализировать CLASSPATH.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

хм... значит какой нибудь стандартной функции нет? В каком-то языке программироания, не помню в каком, есть стд метод определения, в какой директории находится запускаемый файл (вроде C#)

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

В Java запускаемый файл - java (или java.exe) и находится в директории с JRE. Очевидно это не то, что нужно. Остальное может находиться где угодно.

Например /usr/bin/java -cp /opt/myprogram/core.jar:/opt/myprogram/web.jar:/usr/lib/java/hibernate-3.1.jar:/usr/lib/java/log4j.jar:/home/vsb/.myprogram/plugins/weather.jar

И где по-вашему находится запускаемый файл?

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

как же быть то... с перехватом первого аргумента в main тоже не проктит, там вроде тока имя файла передается... если в яве вообще передается ))

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Короче не надо мне ляля такую проблему я встречал и в С++ под линукс

для Windows текущая папка это папка откуда запустили программу а в линуксе(если запускаешь из Иксов не в консоле) папка пользователя /home/user

А раз практики программирования под линукс нету признайтесь так просто будет правильнее а доказывать что белое это черное это бесмысленно


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

Karapuz ★★★★★
()

Если программа запускается из jar-файла, то можно узнать путь к этому jar файлу:

File jarFile = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getFile());
if (jarFile.exists()) {
    String dir = jarFile.getParentFile().getCanonicalPath();
}
MyClass это название какого нибудь класса из программы, например текущего, в котором и будет этот код. А dir это директория где находится jar файл.

Lucky1 ★★★
()
Ответ на: комментарий от Karapuz

То, что под вендой текущий каталог ставится там, где лежит запускаемый файл - всего лишь поведение explorer.exe. Ничего мне не мешает создать ярлык и поменять там текущую директорию. Или при CreateProcessEx указать что угодно. Точно так же и в линуксе. То, о чём вы пишете, всего лишь поведение по умолчанию популярных оболочек в Linux и Windows, никакого отношения к проблемам это не имеет. Что делать я уже сказал - анализировать CLASSPATH запущенного приложения, искать в нём нужный .jar файл и вытаскивать указанный каталог.

Legioner ★★★★★
()
Ответ на: комментарий от Karapuz

значит получается я бреюсь с такой функцией?

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Lucky1
try
        {
            String dir=null;
            File jarFile = new File(MainForm.class.getProtectionDomain().getCodeSource().getLocation().getFile());
            if (jarFile.exists()) {
                dir = jarFile.getParentFile().getCanonicalPath();
            }
            if(dir==null) throw new IOException("BAG");

не работает

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Karapuz
String dir=null;
            File jarFile = new File(".");
            if (jarFile.exists()) {
                dir = jarFile.getAbsolutePath();
            }

в винде dir дает правильный путь, а в линуксе домашний каталог БЛИН, мне какраз под линукс надо чтоб работало

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

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

mv ★★★★★
()
Ответ на: комментарий от mv

ладно.. повернем вопрос по другому, что если в каталоге с jar-ом есть такой файл который нужно открыть, тут тоже относительный путь к файлу не сработает, как быть?

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Karapuz

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

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Karapuz

в баше просто можно установить текущим тот каталог в котором запущен скрипт, и параметр передавать не придется jar-нику

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Походу мой статичный файл нужно тупо запихать в пакет и запускать оттуда (( если и так получится

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

ведь sun тоже не дураки..


поэтому у них мухи отдельно, котлеты отдельно. Файлы в каталогах /usr/... программы в /bin и т.п.

Karapuz ★★★★★
()
Ответ на: комментарий от pozitiffcat

короче решил проблему извращением. В методе main добавил сообщение для пользователя

File fil = new File("rc");
        if(!fil.exists())
        {
            JOptionPane.showMessageDialog(null, "Вам нужно запустить программу в текущем каталоге, для этого в консоли выбрать \ncd каталог_программы \njava -jar ./icewmperf");
            return;
        }

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от mv

у меня установлена.. и вообще 50% программ написаных на всяких там qt и тд, тоже не думают о том что у когото на iceWm нет их библиотек, и то чтобы установить, придется качать еще кучу зависимостей, а ява есть на многих дистрибутивах

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

>50% программ написаных на всяких там qt и тд, тоже не думают о том что у когото на iceWm нет их библиотек, и то чтобы установить, придется качать еще кучу зависимостей, а ява есть на многих дистрибутивах

You've made my day!

Ява - такая же зависимость (да и ещё потолще, чем тот же gtk). И намнооого тормознее.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

про тормознее не спорю.

Я что-то глубоко сомневаюсь, что у пользователей IceWM установлена джава

О чем тогда разговор.. Хочешь юзать прогу, ставь яву, хочешь юзать banshee или tomboy ставь mono и gtk#. Я тут ни причем. Я просто выбрал яву, кто-то другой выбрал Gtk#. и им плевать что у тебя icewm и не установлены соответствующие библиотеки

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

> плевать что у тебя icewm и не установлены соответствующие библиотеки

тебя тролят настолько тонко, что ты даже не вкурил.

Rastafarra ★★★★
()
Ответ на: комментарий от pozitiffcat

ведь sun тоже не дураки.. и я тут не первый кто хочет так сделать...

Сколько видел java программ, у большинства есть пускалка, которая или переходит в нужную директорию, или каким-либо образом передает главному классу.

Не майся херней.

baverman ★★★
()
Ответ на: комментарий от baverman

ок, буду скриптики вкладывать, специально для linux юзеров

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

не вкурил... поясните..

Rastafarra тебя троллит разговорами о том, что «тебя кто-то троллит».

Самое забавное, что не врет ведь.

pathfinder ★★★★
()
Ответ на: комментарий от pozitiffcat

>а как хотябы добраться до ресурса в пакете?

getClass().getResource

И научись читать документацию.

Zenom ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.