为什么我的Rust代码无法进入上述目录?

时间:2019-07-05 01:47:51

标签: rust cd working-directory

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()中放入在let中使用inner_main()函数,然后将let重新声明为字符串,以便我可以cd进入目录。

每当它尝试将CD刻录到nvs目录中时,都不会发生任何事情,并且我知道命令会运行,因为如果我将二进制文件移到同一个目录中没有nvs文件的某个地方,它将运行并说找不到该目录,所以我的问题是它在具有nvs的目录中,为什么它实际上不像应该的那样cd进入所述目录?

1 个答案:

答案 0 :(得分:2)

您正在尝试运行名为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