Откройте файл .exe, не зная полного пути в C ++

Я хочу создать программу, которая открывает другой .exe файл на C ++, я хочу, чтобы программа могла запускаться из любого каталога, поэтому я не буду знать полный адрес файла.

Например: Программа, которую я создаю, будет находиться в папке, которая, в свою очередь, имеет подпапки, которые дополнительно содержат javaportable.exe. Я хочу, чтобы программа выполняла вышеупомянутый .exe без получения полного пути. Что-то вроде оператора cd в обычной навигации DOS. Также, если это возможно, я хочу выбрать другой .exe, который будет проходить через javaportable.exe и присутствует в предыдущей папке.


person Rajat Jain    schedule 29.04.2015    source источник
comment
Прекратите использовать TurboC ++, т.е. скорее всего, программное обеспечение 1993 года, сейчас. И я не думаю, что у вас есть DOS   -  person deviantfan    schedule 29.04.2015
comment
Это то, чему учат в нашей школе. Мне всего 17!   -  person Rajat Jain    schedule 29.04.2015
comment
Тогда, пожалуйста, смени школу, потому что учить эту чушь (и верить в нее) вредит тебе. И неважно, 17 лет тебе, 70 лет или еще что-нибудь.   -  person deviantfan    schedule 29.04.2015
comment
@deviantfan Я считаю неуместным предлагать сменить школу. Не каждый может выбрать школу, которую хочет. Было бы более конструктивно предложить лучшую среду, которую можно было бы использовать в школе. Очевидно, они хотят сэкономить на коммерческой системе и хотят систему, которая проста в использовании и требует мало ресурсов.   -  person harper    schedule 29.04.2015
comment
Прежде всего, установите на домашний компьютер какую-нибудь другую среду IDE, по крайней мере, например, netbeans или Eclipse CDT. Затем покажите нам, какие усилия вы приложили для решения проблемы, потому что здесь никто не напишет за вас весь код. Большая часть использования может помочь там, где вы застряли. Прочтите и это http://stackoverflow.com/questions/1961828/why-not-to-use-turbo-c?rq=1   -  person Priyank    schedule 29.04.2015
comment
@harper Конечно, не все могут, но я его не заставляю. Он просто должен знать, что это совсем плохо. (Например, несколько дней назад другой пользователь сказал, что он предпочел бы нанять кого-то, кто никогда не писал никаких программ, и обучать его C ++ с нуля, вместо того, чтобы нанимать кого-то с таким большим количеством плохих вещей, от которых трудно избавиться). И хотя TurboC ++ является / был коммерческим, и только некоторые части некоторых старых версий доступны бесплатно, GCC и clang бесплатны полностью и без каких-либо условий. Так что этот аргумент не в счет.   -  person deviantfan    schedule 29.04.2015
comment
@deviantfan Речь идет не о приеме на работу, а об учениках в школе. Учитель выбрал способ, который был для него дешевым с точки зрения (1) стоимости лицензии, (2) требований к ПК (оперативная память, частота процессора), (3) кривой обучения. Графический интерфейс Turbo настолько ограничен, что ученики не могут делать то, что выходит за рамки его намерений. Они, вероятно, узнают, как это файлы для ввода некоторого кода C, но не узнают, что можно повторно использовать в реальной жизни. Но сменить школу нельзя для большинства учеников.   -  person harper    schedule 29.04.2015
comment
Ну, @deviantfan все школы в моей стране сейчас преподают Turbo C ++. И я не могу изменить свою страну, просто чтобы выучить другой язык программирования. Это прописанная программа со стороны правительства, и никто не может в этом много помочь. Хотя они все еще ДУМАЮТ изменить программу. Вы не читали ссылку, что оставил приянк? Студент из университета в Мумбаи, и они все еще используют TC. Я из местной школы, как вы думаете, кто-нибудь будет использовать что-нибудь еще в школах!   -  person Rajat Jain    schedule 29.04.2015
comment
@priyank, вам не нужно писать всю программу, просто скажите мне функцию, которая здесь используется. Я слышал о system (), но он просто использует полный путь, а не относительный. Я узнал о system () все, что смог найти на stackexchange, но не смог найти ничего, имеющего отношение к моей проблеме. Цель моей программы совсем иная, и это лишь ее часть, на которой я застрял!   -  person Rajat Jain    schedule 29.04.2015
comment
@harper еще раз прочитал мой комментарий ^. Ничего не от учителя или от школы. Это от правительства, и каждая школа должна следовать этому, по крайней мере в Индии, и все школы, входящие в CBSE, которые находятся за границей. Если они будут учить чему-то другому, ученики обязательно провалится на экзаменах!   -  person Rajat Jain    schedule 29.04.2015
comment
Я все еще не могу понять, что именно вы хотите делать с программой? Как вы могли запустить программу на Google Cloud Drive? Вы хотите, чтобы ваша программа вводила имя файла без адреса и находила его в папке для его выполнения?   -  person Priyank    schedule 29.04.2015
comment
Нет, не думайте, что это работает на облачном диске @priyank. Думайте, что он работает в обычной папке, которая содержит другую папку, в которой находится .exe, который я хочу запустить. Я знаю имя этой папки, но не полный путь к ней.   -  person Rajat Jain    schedule 29.04.2015
comment
Хорошо, вы хотите, чтобы программа запускалась в папке и запускала указанную вами программу, которая также находится в той же папке?   -  person Priyank    schedule 29.04.2015
comment
Не в той же папке, а в другой папке, которая находится в той же папке. @Priyank   -  person Rajat Jain    schedule 29.04.2015
comment
Хорошо, так вы хотите, чтобы он запускал программу, находящуюся в какой-то подпапке?   -  person Priyank    schedule 29.04.2015
comment
Хорошо, я сейчас напишу полный ответ на этот вопрос.   -  person Priyank    schedule 29.04.2015


Ответы (1)


Во-первых, стандартная библиотека C ++ не предоставляет таких функций для вывода списка файлов каталога. Для этого вы можете использовать библиотеки ускорения. Решить эту проблему не так-то просто. Чтобы это сделать, вам придется применить множество приемов. Я могу дать вам все возможные стартовые указатели.

Чтобы перенести этот код на другую ОС, вам может потребоваться добавить код конкретной ОС с помощью директив препроцессора #. Boost Liberay уже является кроссплатформенным.

Прежде всего вам нужно получить текущий путь к каталогу, в котором находится ваша программа:

Для этого вы можете использовать следующий код для ОС Windows

#include <iostream>
#include <direct.h>

int main(){
char *path = NULL;
path = _getcwd(NULL, 0); // or _getcwd
if (path != NULL)
    std::cout << path;
}

Здесь переменная пути содержит адрес текущего каталога. Вы можете передать этот путь следующей функции, которая в дальнейшем будет использовать его для вывода списка файлов и каталогов. Для перечисления каталогов вы можете использовать библиотеки Boost http://www.boost.org/ < / а>

Затем вам нужно будет получить все файлы и папки, имеющиеся в текущем каталоге. Используйте для этого библиотеку Boost

Используйте этот пример кода с сайта boost http://www.boost.org/doc/libs/1_37_0/libs/filesystem/example/simple_ls.cpp

Затем создайте класс и сохраните полученный адрес и имена файлов с путем в его объектах. Вы можете сохранить весь указанный адрес в объекте типа dir[1].str[size], dir[2].str[size],...so on. Теперь снова передайте все адреса папок, которые вы получили, чтобы повысить функцию и получить другие имена файлов. Все вышеперечисленное потребует много пропусков. Вы также можете получить список файлов для определенного расширения файла:

#define BOOST_FILESYSTEM_VERSION 3
#define BOOST_FILESYSTEM_NO_DEPRECATED 
#include <boost/filesystem.hpp>

namespace fs = ::boost::filesystem;

// return the filenames of all files that have the specified extension
// in the specified directory and all subdirectories
void get_all(const fs::path& root, const string& ext, vector<fs::path>& ret)
{
    if(!fs::exists(root) || !fs::is_directory(root)) return;

fs::recursive_directory_iterator it(root);
fs::recursive_directory_iterator endit;

while(it != endit)
{
    if(fs::is_regular_file(*it) && it->path().extension() == ext) ret.push_back(it->path().filename());
    ++it;

}

}

Наконец, сравните имена файлов с тем, которое вы хотите запустить, и выполните его.

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

Ссылки:

  1. Как получить список файлов с определенным расширением в заданной папке
  2. http://www.boost.org/
  3. Как получить список файлов в каталоге на C ++?

    Надеюсь это поможет. Если вам нужна дополнительная помощь, не стесняйтесь спрашивать!

person Priyank    schedule 29.04.2015
comment
Переносится ли это на другие IDE? Если да, то какой из них вы предлагаете? Поскольку я не могу запускать программы с помощью TC на ПК с Windows. - person Rajat Jain; 29.04.2015
comment
Да, вы можете использовать любую IDE, которая вам нравится. Но я определенно рекомендую вам использовать любой из блоков кода, Eclipse CDT или Netbeans, если вы новичок в версии Visual Studio Community. - person Priyank; 29.04.2015
comment
Boost поддерживает только компиляторы примерно последнего десятилетия. Если вам нужна поддержка VC ++ 6, вы можете где-нибудь найти старую версию Boost. Но TC ++ и Boost, вероятно, обречены на провал. - person MSalters; 29.04.2015
comment
@MSalters Полностью согласен. Я не понимаю, почему в наших школах до сих пор учат этому - person Rajat Jain; 29.04.2015
comment
Я также учился на TC ++ до уровня колледжа. Они делают это потому, что должны научить вас только основам. Но я по-прежнему категорически против этого, потому что теперь каждая школа и колледж должны адаптироваться к стандартам C ++ 11, а этому нельзя научить на TC. - person Priyank; 29.04.2015
comment
TC ++ даже не поддерживает C ++ 98. Опять же, я подозреваю, что во всем мире все еще преподается достаточно уроков географии по учебникам, которые еще есть в Советском Союзе. - person MSalters; 30.04.2015
comment
@priyank, мы не можем использовать system (); выглядит намного проще - person Rajat Jain; 30.04.2015
comment
С какой целью вы хотите использовать system ()? - person Priyank; 30.04.2015