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进入所述目录?
答案 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