2017-10-14 13 views
0

Je souhaite lire les fichiers d'un dossier de configuration dans le répertoire où se trouve l'exécutable. Je le fais en utilisant les fonctions suivantes:Comment obtenir uniquement la partie répertoire du chemin de l'exécutable actuel?

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() 
} 

Dans mon cas, get_exe_path() retournera C:\Users\User\Documents\Rust\Hangman\target\debug\Hangman.exe. Avec get_file_path("Config\test.txt"), je souhaite ajouter Config\test.txt au chemin ci-dessus. Ensuite, je reçois le chemin d'accès suivant au fichier: C:\Users\User\Documents\Rust\Hangman\target\debug\Hangman.exe\Config\test.txt

Le problème est que std::env::current_exe() obtiendra également le nom de fichier de l'exécutable et je n'ai pas besoin de cela. J'ai seulement besoin du répertoire où il se trouve.

Question

qui suit l'appel de fonction suivante doit retourner C:\Users\User\Documents\Rust\Hangman\target\debug\Config\test.txt:

let path = get_file_path("Config\\test.txt"); 

Comment puis-je obtenir le chemin du répertoire courant sans le nom de l'exécutable comme exemple ci-dessus? Y at-il d'autres façons de le faire que d'utiliser std::env::current_exe()

Répondre

1

PathBuf::pop est le miroir de PathBuf::push:

tronque self-self.parent.

Renvoie false et ne fait rien si self.file_name est None. Sinon, renvoie true.

Dans votre cas:

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()); 
} 

Il y a aussi la possibilité d'utiliser Path::parent:

Renvoie la Path sans sa composante finale, si elle existe.

Renvoie None si le chemin se termine par une racine ou un préfixe.

Dans votre cas:

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) 
} 

Voir aussi:

+0

@TimonPost J'ai ajouté une autre version qui est un petit peu plus efficace mémoire. – Shepmaster