Я просто попытался запустить новый процесс, разрешив его местоположение с помощью PATH env. вар. Так как я использую Qt, это означает, что я добавил
X: \ папка \
к моей переменной PATH и в моем стартовом приложении я звоню
QProcess :: startDetached ( «test.exe»)
который на самом деле работает.
Однако test.exe записывает данные в свой рабочий каталог. Эти данные попадают в каталог начального приложения вместо X: \ folder \, а это не то, что мне нужно.
Я проверил поведение непосредственно в командной строке Windows, набрав «test.exe» в CLI, и там тоже самое (данные записаны в текущий каталог).
Есть ли способ (в C ++ или командной строке) запустить процесс с использованием PATH, а также использовать каталог, найденный в PATH, в качестве рабочего каталога нового процесса?
Я мог бы найти в PATH свой собственный, проанализировать обнаружение и запустить программу с помощью другой перегрузки QProcess :: startDetached (), но мне интересно, есть ли более простой способ.
Есть как минимум 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(...)
изменить текущий рабочий каталог, где вы хотите, чтобы данные были. Большинство приложений (которые используют принцип хранения файлов в определенном месте, подобном этому) хранят «каталог по умолчанию» в настройке где-то, чтобы пользователь мог изменить настройку в соответствии со своими настройками.