Запустить программу по PATH env. вар. с правильным рабочим каталогом
Я просто попытался запустить новый процесс, разрешив его местоположение с помощью PATH env. вар. Так как я использую Qt, это означает, что я добавил
X:\ папка \
к моей переменной PATH и в моем стартовом приложении я звоню
QProcess::startDetached("test.exe")
который на самом деле работает.
Однако test.exe записывает данные в свой рабочий каталог. Эти данные попадают в каталог начального приложения вместо X:\folder\, а это не то, что мне нужно.
Я проверил поведение непосредственно в командной строке Windows, набрав "test.exe" в CLI, и там тоже самое (данные записаны в текущий каталог).
Есть ли способ (в C++ или командной строке) запустить процесс с использованием PATH, а также использовать каталог, найденный в PATH, в качестве рабочего каталога нового процесса?
Я мог бы найти в PATH свой собственный, проанализировать обнаружение и запустить программу с помощью другой перегрузки QProcess::startDetached(), но мне интересно, есть ли более простой способ.
2 ответа
Есть как минимум 3 варианта без сложных настроек.
1 - Из вашего вызывающего приложения смените текущий каталог на тот, где ваш test.exe
Программа находится. Таким образом, файлы будут идти в нужный каталог. НО тогда возможно, что вызывающее приложение будет иметь проблемы или генерировать выходные данные там, где это не должно быть, поэтому необходимо новое изменение текущего каталога в вызывающем приложении.
2 - передать в качестве параметра к вашему test.exe
где он должен генерировать свои файлы.
3 - Определитесь с вашим test.exe
где он находится и используйте эту информацию, чтобы изменить текущий каталог для этого процесса или, зная путь, сгенерировать файлы в том же каталоге, в котором он находится.
TCHAR szPath[MAX_PATH];
if( !GetModuleFileName( NULL, szPath, MAX_PATH ) ) {
// handle error in GetModuleFileName
} else {
// now, szPath contains file path
};
Это стандартный способ получения местоположения текущего процесса в Windows. Ссылка здесь: GetModuleFileName
ОС не будет "перемещаться в текущий каталог", когда вы используете путь. Вам придется сделать это самостоятельно. (В большинстве случаев вам бы не хотелось, чтобы приложение перемещалось в другой каталог - что, если компилятор сделает это, когда вы gcc foo.c
- тогда вам придется передать полный путь ко всему, так как вы, конечно, не хотите помещать свои исходные файлы туда, где живет компилятор - во многих случаях вы, вероятно, даже не можете записать в этот каталог в Unix/Linux система).
Вам нужно будет либо добавить правильную папку [и я предположил бы, что использование каталога установки приложений может быть не лучшим местом!], Либо сделать chdir(...)
изменить текущий рабочий каталог, где вы хотите, чтобы данные были. Большинство приложений (которые используют принцип хранения файлов в определенном месте, подобном этому) хранят "каталог по умолчанию" в настройке где-то, чтобы пользователь мог изменить настройку в соответствии со своими настройками.