2017-06-07 65 views
2

假設我有以下三條路徑:更換路部分

let file = path::Path::new("/home/meurer/test/a/01/foo.txt"); 
let src = path::Path::new("/home/meurer/test/a"); 
let dst = path::Path::new("/home/meurer/test/b"); 

現在,我想file複製到dst,但我需要正確的路徑,這樣我可以有new_file與解決到/home/meurer/test/b/01/foo.txt的路徑。換句話說,如何從file中刪除src,然後將結果附加到dst

/home/meurer/test/a/01/foo.txt - >/home/meurer/test/b/01/foo.txt

請注意,我們不能假設src將永遠是這個類似於dst

回答

5

您可以使用Path::strip_prefixPath::join

use std::path::Path; 

fn main() { 
    let file = Path::new("/home/meurer/test/a/01/foo.txt"); 
    let src = Path::new("/home/meurer/test/a"); 
    let dst = Path::new("/home/meurer/test/b"); 

    let relative = file.strip_prefix(src).expect("Not a prefix"); 
    let result = dst.join(relative); 

    assert_eq!(result, Path::new("/home/meurer/test/b/01/foo.txt")); 
} 

像往常一樣,你可能不希望在生產代碼中使用expect,它的唯一的答案的簡潔。

+0

當然!太快了:P – Centril

+0

@Centril Shepmaster總是回答這麼快,我只是理解Shepmaster回答的問題^^ – Stargateur

+1

@Centril在這種情況下,我有一個不公平的優勢。這個問題實際上是在[SO Rust chatroom](http://chat.stackoverflow.com/rooms/62927/rust)中首先提出的,所以我在這裏發佈問題之前已經準備好了答案^ _ ^。 – Shepmaster