Почему мой код Rust не попадает в указанный каталог? - PullRequest
0 голосов
/ 05 июля 2019
use std::{
    env, io,
    path::PathBuf,
    process::{self, Command},
};

fn inner_main() -> io::Result<PathBuf> {
    let exe = env::current_exe()?;
    let dir = exe.parent().expect("Executable must be in some directory");
    let dir = dir.join("nvs");
    Ok(dir)
}

fn main() {
    let path = inner_main().expect("Couldn't get path.");
    let path = path.into_os_string().into_string().unwrap();
    Command::new("cd")
        .arg(&path)
        .status()
        .expect("Something went wrong.");
    process::exit(0);
}

Я беру путь, в котором находится двоичный файл, захожу в родительский каталог, чтобы имя двоичного файла больше не было в пути, а затем добавляю "nvs" в конце пути, а затем в main() Iпоместите функцию inner_main() в let, а затем повторно объявите let как строку, чтобы я мог перейти в каталог.

Всякий раз, когда он пытается выполнить CDing в каталог nvs, ничего не происходит, и я знаю, что команда выполняется, потому что еслиЯ перемещаю бинарный файл куда-то без файла nvs в тот же каталог, в котором он работает, говоря, что не может найти этот каталог, поэтому мой вопрос: когда он находится в каталоге с nvs, почему он на самом деле не записывается в указанный каталог, как должно?

1 Ответ

2 голосов
/ 05 июля 2019

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

Чтобы перейти в другой каталог, вам нужно изменить рабочий каталог вашегособственный процесс.Звоните std::env::set_current_dir.

std::env::set_current_dir(&path).expect("Unable to change into [path to executable]/nvs");
// do stuff in …/nvs
...