我想从给定的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