我想從給定的String路徑中提取文件的擴展名。從Rust中給定路徑中提取文件擴展名慣用
下面這段代碼工作,但我不知道是否有一個更清潔,更地道的防鏽方法來實現這一目標:
use std::path::Path;
fn main() {
fn get_extension_from_filename(filename: String) -> String {
//Change it to a canonical file path.
let path = Path::new(&filename).canonicalize().expect(
"Expecting an existing filename",
);
let filepath = path.to_str();
let name = filepath.unwrap().split('/');
let names: Vec<&str> = name.collect();
let extension = names.last().expect("File extension can not be read.");
let extens: Vec<&str> = extension.split(".").collect();
extens[1..(extens.len())].join(".").to_string()
}
assert_eq!(get_extension_from_filename("abc.tar.gz".to_string()) ,"tar.gz");
assert_eq!(get_extension_from_filename("abc..gz".to_string()) ,".gz");
assert_eq!(get_extension_from_filename("abc.gz".to_string()) , "gz");
}
所以你想要得到最左邊的點後的一切?這會給錯誤的結果「版本1.2.txt」 – interjay
@interjay,是的,因此我維護允許擴展的散列表,因此'2.txt'會驚慌。我的意圖是以通用的方式提取可能的擴展,並與允許的擴展hashmap進行比較。 – Sokio
'.tar.gz'不是一個獨立的擴展名,它是一個'.gz'文件,當解壓縮時會得到一個'.tar'文件。你應該遵循相同的過程。提取擴展部分和非擴展部分,並遞歸處理非擴展部分拉伸擴展。 – loganfsmyth