如何仅获取当前可执行文件路径的目录部分?

24

我想从可执行文件所在的目录下的一个名为 config 的文件夹中读取文件。我使用以下函数来实现:

use std::env;

// add part of path to te path gotten from fn get_exe_path();
fn get_file_path(path_to_file: &str) -> PathBuf {
    let final_path = match get_exe_path() {
        Ok(mut path) => {
            path.push(path_to_file);
            path
        }
        Err(err) => panic!("Path does not exists"),
    };
    final_path
}

// Get path to current executable
fn get_exe_path() -> Result<PathBuf, io::Error> {
    //std::env::current_exe()
    env::current_exe()
}
在我的情况下,get_exe_path() 将返回 C:\Users\User\Documents\Rust\Hangman\target\debug\Hangman.exe
使用 get_file_path("Config\test.txt"),我想将 Config\test.txt 追加到上面的路径中。然后我得到了以下文件路径:C:\Users\User\Documents\Rust\Hangman\target\debug\Hangman.exe\Config\test.txt 问题在于,std::env::current_exe() 还会获取可执行文件的文件名,而我不需要那个。我只需要它所在的目录。
问题:以下函数调用应该返回 C:\Users\User\Documents\Rust\Hangman\target\debug\Config\test.txt
let path = get_file_path("Config\\test.txt");

如何获取当前目录的路径,而不包括上述示例中的可执行文件名?除了使用std::env::current_exe()之外,还有其他方法吗?

我该怎么做才能获得所需结果?

1个回答

29

PathBuf::popPathBuf::push 的镜像:

self 截断到 self.parent

如果 self.file_nameNone,则返回 false 并不执行任何操作。否则,返回 true

在你的情况下:

use std::env;
use std::io;
use std::path::PathBuf;

fn inner_main() -> io::Result<PathBuf> {
    let mut dir = env::current_exe()?;
    dir.pop();
    dir.push("Config");
    dir.push("test.txt");
    Ok(dir)
}

fn main() {
    let path = inner_main().expect("Couldn't");
    println!("{}", path.display());
}

还有一种可能是使用Path::parent

返回不包含最后一部分的Path,如果有的话。

如果路径以根或前缀结尾,则返回None

在您的情况下:

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

另请参阅:


PathBuf :: pop的文档现在指出:“将自身截断为self.parent。如果self.parent为None,则返回false并不执行任何操作。否则,返回true。”这与此回答引用的内容不同(我猜是旧文档),该内容说“如果self.file_name为None,则不执行任何操作” - drojf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接