Как получить путь к исполняемому файлу c

Обновлено: 06.07.2024

Открываю файл используя потоки, например:
ifstream inputFile("file.txt");
или
ifstream inputFile;
.
inputFile.open("file.txt");

Можно ли как-то открыть файл, находящийся не в той же директории что и исполняемый exe?
И как тогда указать путь к нему? Че то никак не получается.

Директория(или поддиректория) в которой находится файл, вложена в
ту, где находится exe, т.е. не где-то на высшем уровне, не знаю как правильно сказать

В Win относительные пути вполне вроде бы работают ( ..\ и т. п. ).
Можно указывать полный путь: получить путь к месту расположения приложения и дальше уже считать от этой директории.
И как тогда указать путь к нему? Че то никак не получается.
Директория(или поддиректория) в которой находится файл, вложена в ту, где находится exe, т.е. не где-то на высшем уровне, не знаю как правильно сказать
запускаем программу без установки нужного текущего каталога, и получаем глюк!
запускаем программу без установки нужного текущего каталога, и получаем глюк!

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

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

<div >ifstream inputFile("SomeSubDirectory\\AnotherSubDirectory\\ file.txt");[/code][/quote]

Это именно то что мне было нужно. Оказывается двойной бэкслэш надо было ставить.
Теперь уже понял почему. Ступил

Относительного пути думаю хватит. Юзер о файле ничего знать не будет.
Файл открывается 1 раз при запуске программы, для загрузки некоторых данных,
после чего сразу закрывается.

Относительного пути думаю хватит. Юзер о файле ничего знать не будет.
Файл открывается 1 раз при запуске программы, для загрузки некоторых данных,
после чего сразу закрывается.
смысла моих слов вы так и не поняли.
почему думаете, что относительного хватит? почему, думаете, может не хватить? какая разница, знает ли что-то юзер и сколько раз открывается файл?
посмотрите в поиске, ваше программа при определённых условиях просто не будет работать, вот и всё.
смысла моих слов вы так и не поняли.
почему думаете, что относительного хватит? почему, думаете, может не хватить? какая разница, знает ли что-то юзер и сколько раз открывается файл?
посмотрите в поиске, ваше программа при определённых условиях просто не будет работать, вот и всё.

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

Существует ли агностик-агностик и файловая система-агностик для получения полного пути к каталогу, из которого выполняется программа с использованием C/С++? Не путать с текущим рабочим каталогом. (Пожалуйста, не предлагайте библиотеки, если они не являются стандартными, такими как clib или STL.)

(Если нет метода агностики с платформой/файловой системой, также приветствуются предложения, которые работают в Windows и Linux для определенных файловых систем.)

Здесь код, чтобы получить полный путь к исполняемому приложению:

Если вы загружаете текущий каталог, когда ваша программа запускается сначала, вы фактически получаете каталог, из которого была запущена ваша программа. Сохраните значение в переменной и обратитесь к нему позже в вашей программе. Это отличается от каталога, который содержит текущий исполняемый файл программы. Это не обязательно один и тот же каталог; если кто-то запускает программу из командной строки, тогда программа запускается из текущего рабочего каталога командной строки, даже если файл программы находится в другом месте.

getcwd - это функция POSIX и поддерживается на всех платформах, совместимых с POSIX. Вам не нужно было делать что-либо особенное (кроме того, чтобы вставлять правильные заголовки unistd.h в Unix и direct.h на windows).

Поскольку вы создаете программу на языке C, она связывается с библиотекой времени выполнения c по умолчанию, которая связана с всеми процессами в системе (исключение специально созданных исключений), и она будет включать эту функцию по умолчанию. CRT никогда не считается внешней библиотекой, поскольку он обеспечивает базовый стандартный совместимый интерфейс для ОС.

В окнах функция getcwd устарела в пользу _getcwd. Я думаю, вы можете использовать его таким образом.

В окнах:

В Linux:

В HP-UX:

Если вы хотите стандартный путь без библиотек: Нет. Вся концепция каталога не включена в стандарт.

Если вы согласны с тем, что некоторая (переносная) зависимость от почти стандартной библиотеки в порядке: используйте Ускорить библиотеку файловой системы и попросить initial_path().

ИМХО, что как можно ближе, с хорошей кармой (Boost - это хорошо зарекомендовавший себя набор высококачественных библиотек)

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

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

Я пробовал этот подход в Linux, используя полный путь, псевдоним и т.д., и он отлично работает.

Если вы находитесь в окнах, вы должны использовать '\' в качестве разделителя файлов, а не '/'. Вам также придется избегать этого, например:

Файловая система TS теперь является стандартом (и поддерживается gcc 5.3+ и clang 3.9+), поэтому вы можете использовать current_path() от него:

В gcc (5.3+) для включения файловой системы вам необходимо использовать:

и свяжите свой код с флагом -lstdc++fs .

Если вы хотите использовать файловую систему с Microsoft Visual Studio, прочитать это.

Нет, нет стандартного пути. Я считаю, что стандарты C/С++ даже не рассматривают существование каталогов (или других организаций файловой системы).

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

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

Может быть, конкатенировать текущий рабочий каталог с помощью argv [0]? Я не уверен, что это будет работать в Windows, но оно работает в Linux.

При запуске он выдает:

/Desktop $./test
/Главная/Jeremy/Desktop/./тест

Вы не можете использовать argv [0] для этой цели, обычно он содержит полный путь к исполняемому файлу, но не обязательно - процесс может быть создан с произвольным значением в поле.

Также обратите внимание, что текущий каталог и каталог с исполняемым файлом - это две разные вещи, поэтому getcwd() вам тоже не поможет.

В Windows используйте GetModuleFileName(), в файлах Linux read/dev/proc/procID/..

В Windows самый простой способ - использовать функцию _get_pgmptr в stdlib.h чтобы получить указатель на строку, представляющую абсолютный путь к исполняемому файлу, включая имя исполняемого файла.

Для Win32 GetCurrentDirectory должен сделать трюк.

Просто запоздало куча здесь.

нет стандартного решения, поскольку языки являются агностическими для базовых файловых систем, так как другие говорили, что концепция файловой системы на основе каталогов выходит за рамки языков c/С++.

Кроме того, вы не хотите, чтобы текущий рабочий каталог, но каталог, в котором запущена программа, который должен учитывать, как программа добралась до места, то есть была ли она порождена как новый процесс через вилку и т.д. Чтобы получить каталог, в котором запущена программа, как продемонстрировали решения, требуется, чтобы вы получили эту информацию из структур управления процессом соответствующей операционной системы, которая является единственным органом по этому вопросу. Таким образом, по определению, это решение, специфичное для ОС.

Для системы Windows на консоли вы можете использовать команду system ( dir ). И консоль предоставляет информацию о каталоге и т.д. Читайте о команде dir в cmd . Но для Unix-подобных систем я не знаю. Если эта команда запущена, прочитайте команду bash. ls не отображает каталог.

Для относительных путей, вот что я сделал. Я знаю возраст этого вопроса, я просто хочу внести более простой ответ, который работает в большинстве случаев:

Скажите, что у вас есть такой путь:

По какой-то причине исполняемые Linux-исполняемые файлы, созданные в eclipse, отлично справляются с этим. Тем не менее, окна очень запутаны, если для этого нужен путь, подобный этому!

Как указано выше, существует несколько способов получить текущий путь к исполняемому файлу, но самый простой способ, которым я нахожу работу, в большинстве случаев - это добавить его к FRONT вашего пути:

Просто добавив "./", вы должны отсортировать его!:) Затем вы можете начать загрузку из любого каталога, который вы хотите, если это будет с самим исполняемым файлом.

EDIT: это не сработает, если вы попытаетесь запустить исполняемый файл из кода:: блоков, если используется среда разработки, по какой-то причине, код:: блоки не загружают данные правильно. D

EDIT2: Некоторые новые вещи, которые я нашел, это то, что если вы укажете статический путь, подобный этому в своем коде (Предположим, что Example.data - это то, что вам нужно загрузить):

Если вы затем запустите свое приложение из фактического каталога (или в Windows, вы создаете ярлык и устанавливаете рабочий каталог в каталог приложения), тогда он будет работать так. Помните об этом при отладке проблем, связанных с отсутствием путей к ресурсам и файлам. (Особенно в среде IDE, которые устанавливают неправильный рабочий каталог при запуске сборки exe из среды IDE)

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

Как бы я это сделал? домен приложений.CurrentDomain.BaseDirectory просто дает мне расположение VS 2008.

вы можете попробовать один из этих двух методов.

скажите, какой из них вам кажется лучше

Я надеюсь, что это поможет:

Это позволит получить каталог проекта

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

конечно, вы хотели бы содержать это в какой-то проверки/обработки ошибок.

Если вы хотите узнать, что такое каталог, в котором находится ваше решение, вам нужно сделать это:

Если вы позволите только с GetCurrrentDirectory() метод, вы получаете папку сборки независимо от того, если вы отладки или выпуска. Я надеюсь, что это поможет! Если вы забудете о проверках, это будет выглядеть так:

Если проект выполняется на IIS express, то Environment.CurrentDirectory может указывать, где находится IIS Express ( путь по умолчанию будет C:\Program файлы (x86)\IIS Express ), а не туда, где находится проект.

это, вероятно, наиболее подходящий путь к каталогу для различных видов проектов.

это определение MSDN.

возвращает базовый каталог, который сопоставитель сборок использует для поиска сборки.

Я тоже это искал. У меня есть проект, который запускает HWC, и я хотел бы сохранить веб-сайт из дерева приложений, но я не хочу держать его в каталоге отладки (или выпуска). FWIW, принятое решение (и это тоже) только идентифицирует каталог, в котором работает исполняемый файл.

найти этот каталог, я использую

еще один способ сделать это

Если вы хотите получить путь к папке bin

может быть, есть лучший способ =)

у меня была аналогичная ситуация, и после бесплодных Googles я объявил публичную строку, которая модифицирует строковое значение пути отладки / выпуска, чтобы получить путь к проекту. Преимущество использования этого метода заключается в том, что, поскольку он использует каталог проекта currect, не имеет значения, работаете ли вы из каталога отладки или каталога выпуска:

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

Это должно работать в большинство случаях.

используйте это, чтобы получить каталог проекта (работал для меня):


Казалось бы — что может быть проще, чем работа с файлами в C++. Но отдельные личности поражают своей находчивостью в поиске наихудшего подхода.
Не стоит делать так:

std::string filepath("C:\\тест");
std::ofstream file(filepath.c_str());


Если кратко, то использование не ASCII символов в строковых константах char может привести к печальным последствиям. Я уже обсуждал этот вопрос в посте о кодировках. В данном случае название файла напрямую зависит от кодировки исходника и если кто-то напишет подобное в utf-8, в windows-xp можно получить файл с запрещенными символами, с которым невозможно будет ничего сделать. Можно не использовать не ASCII. Но вы же не можете запретить это пользователю (потоку или БД из которого получен путь). Это же дискриминация по национальному признаку! Срочно исправляемся:

std::wstring filepath= L"C:\тест"
std::ofstream file(filepath.c_str());

Несведущие в стандарте пользователи Visual Studio могут успокоиться, пока нужда не заставит сменить компилятор (точнее STL). И тут начинается…

— «дурацкий gcc» или «дурацкий stlport» не содержит конструктор ofstream::ofstream(wchar_t*)

Дело в том, что текущий стандарт и не предполагает его наличия (не трогаем пока C++0x). Это в чистом виде энтузиазм мелкомягких.

Что же делать?

  • Использовать стороннюю библиотеку для работы с путями (к примеру boost::filesystem)
  • Использовать std::locale
  • Придумывать свой

С третьим вариантом все ясно, с первым тоже ничего сложного:

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

Пользуемся std::locale

Отступление.
Огорчу пользователей mingw: вам придется использовать стороннюю реализацию STL (к примеру stlport) из-за отсутствия в родной правильной поддержки локализации. А точнее, функция std::locale("") всегда возвращает std::locale(«C»), что бы там у вас не стояло. Тот же stlport лишен подобного недостатка. О том как слепить связку mingw+stlport+boost я отписал тут.

Все что нам нужно сделать это следовать простым правилам — с не ASCII работаем в «расширенном» виде. То есть, читаем путь в std::wstring, используя соответствующим образом локализованный поток, а при использовании, сужаем по пользовательской локализации. Эта идея основана на том, что раз пользователь правильно видит символы своего языка в консоли, то его пользовательская локализация знает в какую кодировку надо сузить широкую строку, чтобы правильно интерпретировать путь. Итак, пример. Допустим у нас есть файл в кодировке cp866, содержащий путь. Нам необходимо создать файл по этому пути. Что мы делаем:

Фасеты можно взять на git-hub.

SUMMARY

Если вы используете путь из argv — можете смело с ним работать (пользователь знает что делает). Из «внешней среды» путь получайте с помощью правильно локализованного потока как широкую строку и сужайте ее с помощью пользовательской локализации.

С вопросами можно обращаться:
0. К стандарту
1. К книге Страуструпа (3-е специальное издание, приложение)
2. К документации по mingw.
3. К документации по boost.
4. К посту о фасетах и кодировках.

Всем прямых путей!

UPD: Ну и как правильно заметили Gorthauer87,Migun и naryl в комментариях, обратные слеши и платформо-специфичные пути тоже плохая идея.

Что это?
PATH является переменной среды и представляет собой список папок, который используется операционной системой для поиска исполняемых файлов (*.EXE).
На практике, если папка добавлена в PATH, исполняемые файлы можно запускать из командной строки без указания полного пути к ним.

    задать полный путь к исполняемому файлу:

Как добавить?
Добавить папку в PATH можно:

1) при помощи графического интерфейса Windows.
Открыть окно свойств системы (WIN+PAUSE), на вкладке "Дополнительно" нажать кнопку "Переменные среды", в разделе "Системные переменные" выделить "PATH" и нажать кнопку "Изменить".
Через точку с запятой прописать путь к папке без кавычек, как в примере:

Change_Path.jpg

2) воспользоваться таким БАТ-файлом:

Для Windows Vista, 7, 8 скрипт нужно запускать с повышенными правами.

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

Альтернативно, обновление пользовательских параметров можно форсировать запуском утилиты SetX, которая встроена в Windows 7.
В остальных версиях распространяется в составе Windows Resourse Kit.

В конце кода нужно дописать:

P.S. Здесь же можно хранить и пользовательские переменные, которые необходимо сделать глобальными.
Например, чтобы создать переменную с именем MyVar и значением MyValue,
выполните команду:

Dragokas

Very kind Developer

Как это использовать?

Допустим мы добавили C:\Program Files\Winrar к путям "Path",
В этой папке имеем:

rar_folder.jpg

Какие преимущества получаем?

Можем открывать любой файл из этой папки, просто введя его имя
(для исполняемых файлов EXE, Com, Bat. расширение имени указывать не обязательно).

1) Вводим имя в поисковую строку меню "ПУСК" (для ОС >= Vista)

Нажимаем ПУСК (в Windows 8 - нажимаем Ctrl + Esc, или клавишу "Win" ("флажок"))

path_start.jpg

Вводим слово winrar
Получаем подсказку, какие имена найдены.
Затем можно нажать кнопку ENTER, либо мышкой нажать на найденный интересующий нас файл.

2) ПУСК -> Выполнить (для ОС >= Vista нажимаем комбинацию Win + R)

path_Execute.jpg

Откроется файл справки. Так можно открывать любой файл.

3) Через командную строку.

path_cmd.jpg

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

4) Через реестр:
например, добавив в
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
параметр с именем исполняемого файла без указания полного пути,
программа автоматически запустится при загрузке ОС.

Читайте также: