LINUX.ORG.RU

Странное поведение "../" в пути к файлу.


0

0

Вообщем странная фигня возникла. Разрабатываю проект в KDevelop, в моей проге юзается конфиг файл и файл темы. Путь к первому прописан явно, т.е. /etc/ldm/ldm.conf а путь к конфигу темы не явно, т.е. ../share/ldm/themes/default/theme.conf. Так вот, оба файла открываются и нормально читаются, если бинарник запущен из KDevelop'а ( Shift+f9 ), а если его скопировать в /usr/bin то конфигурационный файл открывается а вот файл темы не хочет, узнаю об этом по сообщению, которое я забил в код для проверки наличия файла и последующему сегфолту. При этом как я уже сказал из КДевелопа всё работает. Файл темы лежит в /usr/share/ldm/themes/default/theme.conf а в проекте, покольку бинарник кладётся в debug/src/ldm, в debug/share/....


void ldm::getConfig ( )
{
file_conf = new QString ( "/etc/ldm/ldm.conf" );

QFile *conf_file = new QFile ( *file_conf );
if ( !conf_file->open ( IO_ReadOnly ) )
{
QMessageBox::information( this, "LDM",
"Unable to find the configuration file.\n"
"The factory default will be used instead." );

file_passwd = new QString ( "/etc/passwd" );
file_theme = new QString ( "../share/ldm/themes/default/theme.conf" );
}
else
{
QStringList conf = loadFile ( *file_conf );
file_passwd = new QString ( getPasswdFilePath ( conf[1] ) );
theme_name = getThemeName ( conf[2] );
file_theme = new QString ( "../share/ldm/themes/" + theme_name + "/" + "theme.conf" );
//file_theme = new QString ( "/usr/share/ldm/themes/default/theme.conf" );
}
conf_file->close ( );
delete file_conf;
delete conf_file;
}

void ldm::getTheme ( )
{
QFile *theme_file = new QFile ( *file_theme );
if ( !theme_file->open ( IO_ReadOnly ) )
{
QMessageBox::information( this, "LDM",
"Unable to find the theme file.\n"
"The factory default will be used instead." );

file_img_background = new QString ( "../share/ldm/themes/default/b.png" );
}
else
{
QStringList theme = loadFile ( *file_theme );
file_img_background = new QString ( "../share/ldm/themes/" + theme_name + "/" +
getBackgndImg ( theme[1] ) );
}
theme_file->close ( );
delete file_theme;
delete theme_file;
}



Может кто подскажет почему двоеточие не работает в системе а работает только в среде разработки.

Заранее спасибо!!!

★★★★★

Re: Странное поведение "../" в пути к файлу.

Есть подозрение, что текущим у тебя будет тот каталог, в котором ты находишся, а не /usr/bin, а запущенная программа от shell'а унаследует текущий каталог, и естественно, у тебя будет ../ указывать не в /usr.

Spectr ★★★ ()

Re: Странное поведение "../" в пути к файлу.

а ты запускаешь свой бинарник находясь в /usr/bin ?

Dead ★★★★ ()

Re: Re: Странное поведение "../" в пути к файлу.

Запуск идёт от туда где я нахожусь по дефолту, либо где я был до этого, но не в /usr/bin ( короче куда кинет баш и konsole ). Т.е. бинарник запускаю находясь там где меня нет ( в /usr/bin ) простой командой ldm и всё.

cyclon ★★★★★ ()

Re: Странное поведение "../" в пути к файлу.

Тебе, мил человек, надобно прочитать Unix Programming FAQ
http://www.erlenstar.demon.co.uk/unix/faq_toc.html

В частности вопрос:
1.14 How can I find a process' executable file?

И проистекающий от него:
1.14.1 So where do I put my configuration files then?

anonymous ()
Ответ на: Re: Странное поведение "../" в пути к файлу. от anonymous

Re: Re: Странное поведение "../" в пути к файлу.

Фак неплохой, но...

1. В arg[0] пути нет. 2. Куда именно добовлять обьявление и как оно должно выглядеть. Там написано что в конфигуратор ./configure'а я так понял в configure.in , но как именно.

cyclon ★★★★★ ()

Re: Re: Re: Странное поведение "../" в пути к файлу.

>Там написано что в конфигуратор ./configure'а я так понял в configure.in , но как именно.

Элементарно добавляется Просто читаешь доку по autoconf. Благо она имеется в разделе документации на русском языке. Плюс смотреть примеры, благо их хватает.

Dead ★★★★ ()

Re: Странное поведение "../" в пути к файлу.

>1. В arg[0] пути нет

Странно, а вроде должен быть. Если я правильно понял проблему, то ее решение заключается в том чтобы при запуске программы установить текущий каталог на каталог с ее местом расположения. Подобную проблему я решал именно с помощью arg[0] (!!!???). То есть в main использовался QDir для установки текущего каталога который QRegExp (кажется так он называется) парсился из arg[0].

KIV ()

Re: Re: Странное поведение "../" в пути к файлу.

> Странно, а вроде должен быть. Если я правильно понял проблему, то ее решение заключается в том чтобы при запуске программы установить текущий каталог на каталог с ее местом расположения. Подобную проблему я решал именно с помощью arg[0] (!!!???). То есть в main использовался QDir для установки текущего каталога который QRegExp (кажется так он называется) парсился из arg[0].

Да неа ты не понял, текущий каталог мне знать не нужно, т.е. текущий каталог пользователя, а каталог где лежит прога.

cyclon ★★★★★ ()

Re: Re: Re: Странное поведение "../" в пути к файлу.

> Элементарно добавляется Просто читаешь доку по autoconf. Благо она имеется в разделе документации на русском языке. Плюс смотреть примеры, благо их хватает.

А где, я смотрел доки на лоре но чё то не нашёл, может плохо искал. Подкинь сссылочку, буду признателен.

cyclon ★★★★★ ()

Re: Re: Re: Re: Re: Странное поведение "../" в пути к файлу.

Короче как там всё пространно, может всё же покажешь как это должно выглядеть, А! А то впринципе прога готова (альфа, но всё же), а вот этом префиксе вся загвоздка.

cyclon ★★★★★ ()

Re: Re: Re: Re: Re: Re: Странное поведение "../" в пути к файлу.

1. в configure.in если еще не добалено добавить 
AM_CONFIG_HEADER(config.h)

2. в configure.in добавить
AC_DEFINE_UNQUOTED(PREFIX, "$prefix", [Install prefix])

3. запустить как обычно
aclocal
autoconf
automake
autoheader

4. Проверить наличие в config.h макроса PREFIX

5. Подключить в своей программе
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif


6. ИСпользовать дефайн PREFIX по своему усмотрению


Dead ★★★★ ()

Re: Странное поведение "../" в пути к файлу.

Тогда проще не мудиться а сделать так:

1. В каталог /usr/bin кидаешь свою прогу под названием idm.exe :) 2. В /usr/bin кидаешь скрипт idm содержащий: #!/bin/sh `cd /usr/bin; ./idm.exe`

и все! :) Можно это прибарабанить к make install c prefix-ом.

ЗЫ. Лучше всего всетаки ИМНО свои проги инсталить куданибудь в /usr/local/xxx а в /usr/bin складывать или ссылки или скрипты запуска

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