2017-10-14 67 views
0

我想从可执行文件所在目录的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。我想追加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

PathBuf::popPathBuf::push镜:

截断selfself.parent

返回false,如果self.file_nameNone,则不执行任何操作。否则, 返回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) 
} 

参见:

+0

@TimonPost我添加了另一个版本,更一点点内存使用效率。 – Shepmaster

相关问题