Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/55: Рейтинг темы: голосов - 55, средняя оценка - 4.71
 Аватар для HalfBanana
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 2

Узнать путь к директории программы

24.05.2015, 12:22. Показов 10444. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу на Си под Линухом. Нужно, чтобы файл, который создает программа, сохранялся не в одной с ней директорией, а во вложенной папке. То есть если прога (а именно исполняемый файл) лежит в /prog, то файл должен сохраниться в prog/file.

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

Я видел способы сделать это для других языков и для Win, но вот конкретно для Си и Линуха не нашел. Помогите, люди добрые.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2015, 12:22
Ответы с готовыми решениями:

Как узнать количество папок в директории?
Вот нашел в интернете такие команды: Данная команда, рекурсивно подсчитает количество файлов начиная с текущей папки и всех вложенных:...

Как узнать атрибуты файлов и папок директории?
Здравствуйте! Знаю, как вывести с помощью функций diropen, readdir, closedir и scandir содержимое директории, но вот как узнать еще...

Как узнать путь к директории приложения
Имеется форма, на которой есть кнопка с картинкой на заднем фоне. При событии наведения на неё курсора, нужно поменя ету картинку на...

7
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
24.05.2015, 16:22
Цитата Сообщение от HalfBanana Посмотреть сообщение
чтобы программа каким-то образом узнала, где она лежит.
/proc/self/exe - символическая ссылка, в которой указан путь к вашей исполняемой программе. читаете ссылку с помощью readlink. оттуда и узнаете, где она (программа) лежит.
1
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
24.05.2015, 19:30
Лучший ответ Сообщение было отмечено HalfBanana как решение

Решение

Параметр argv[0] в функции main(int argnum, char* argc[], char*argv[] ) содержит строку программы с полным путём.

Но это вроде бы не оговорено в стандарте (не помню) и содержимое argv[0] может таковым не быть в некоторых реализациях C
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
24.05.2015, 20:22
Цитата Сообщение от drfaust Посмотреть сообщение
содержит строку программы с полным путём.
только если программа вызывается с полным путем. а если обобщить, то содержится тот путь(абсолютный, относительный, или просто имя команды(basename)), с которым она была вызвана. вы правы - стандарт это не оговаривает, но я не знаю, в какой системе иначе.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
24.05.2015, 21:26
Цитата Сообщение от retmas Посмотреть сообщение
но я не знаю, в какой системе иначе.
В ДОС с bc31 вываливает полный путь, но если текущий каталог совпадает с путём проги, то только имя.
В линухе есть ещё переменная среды с именем "_" - тут уже без компромиссов только полный путь, которую тоже можно через argv выцепить (по крайней мере в моих арчах и одном дебе так).
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
24.05.2015, 22:21
Цитата Сообщение от drfaust Посмотреть сообщение
В линухе есть ещё переменная среды с именем "_" - тут уже без компромиссов только полный путь, которую тоже можно через argv выцепить
именно, что переменная среды, которую "можно выцепить" из 3-го параметра ф-ии main (который называют envp), а не 2-го.(argv) (хотя, конечно, используя, мягко говоря, "не совсем стандартные методы" и через argv можно).
про дос и как там было я уже не помню, и, честно говоря, лично мне он давно не интересен (даже просто "академически"), но спасибо, что упомянули, т.к. я о нем и не задумывался(мне не интересен же), а кому-то может и пригодится. хотя, если тут
Цитата Сообщение от drfaust Посмотреть сообщение
В ДОС с bc31
вы имели ввиду выполнение из среды борланда, то скорее всего там просто подсовывается именно полный путь
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
24.05.2015, 22:53
Цитата Сообщение от retmas Посмотреть сообщение
именно, что переменная среды, которую "можно выцепить" из 3-го параметра ф-ии main (который называют envp), а не 2-го.(argv)
Писал по памяти, потому и привёл вызов main() - что бы не было путаницы. Имел ввиду именно третий параметр, ну а то что обозвал не привычно - сорри. Давно в переменные не лазил...
Цитата Сообщение от retmas Посмотреть сообщение
вы имели ввиду выполнение из среды борланда,
Не из среды, а используя bcc с их либами. И борландовские инит-объектные файлики ведут себя именно так. Если прога запускается из текущего каталога, то только имя. Когда-то давно ковырял их исходники, но сейчас не вспомню как именно они заполняют список переменных среды. Юзал этот ergv (aka envp) для хелпа, мол имя проги и параметры, имя приходилось выделять, что бы путь не влезал, но заметилэто не сразу, ибо обычно запуск проги идёт из тогоже каталога где она и лежит - просто запомнился этот случай ещё с 2000х годов.
0
 Аватар для HalfBanana
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 2
25.05.2015, 11:33  [ТС]
Всем спасибо. argv[0] при простом запуске программы выглядит примерно так ./prog.
Это натолкнуло меня на мысль, что можно при открытии файла в программе указать в его имени ./file/[имя файла] и он создастся в папке file. Собственно, так и оказалось.
И, хотя это не дает полный путь к директории программы, с нужной мне задачей справляется.
Еще раз всем спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2015, 11:33
Помогаю со студенческими работами здесь

Узнать путь к файлу в директории приложения
Здравствуйте, мне необходимо узнать в программе путь к папке где находится программа и сохранить его в переменную. Подскажите с помощью...

Webkitdirectory как узнать путь выбранной директории?
Всем доброго времени суток, долго искал но не нашел нужную информацию. Поставил задачу открыть диалоговое окно для выбора папки и...

Как указать путь к БД, если она расположена в директории программы
У меня проект. Delphi создало внутри папки с проектом(где сохраняются исходники) ещё одну под названием win32, а там папка Debug. И вот...

Как узнать полный путь программы?
как узнать папка откуда запущена программа? чтобы потом установить ее для JFileChooser, чтобы он открыл диалог там же где class file

Как узнать путь своей программы?
Kak uznati path gde nahoditsea moea proga(exe) ??


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru