您可能需要使用Path
的file_name()
方法,该方法生成文件名if.这是一个常规文件,因此它返回Option
.
I imagine you'd want to ignore the file names of things that aren't regular files, i.e. for which file_name()
would return None
, in which case you will probably want to leverage Iterator
's filter_map
method which is basically like filter and map put together, i.e. you're able to map (in this case the path -> file name) and filter by returning the mapped result as an Option
, where None
would signify that you want to filter that value out.
恼人的是,您必须判断ReadDir
迭代器返回的每个项,因为这是Result
类型,所以您必须查看它是否为Ok
.如果您只想忽略目录中的非Ok
个(即Err
个)条目(例如您没有权限的条目),只需使用Result
的ok()
方法将其转换为Option
,并将其集成到filter_map
中即可.
由于UTF也可能是从UTF file_name()
返回的,所以它也可能不是从UTF file_name()
返回的.使用map
和and_then
的组合,可以简单地再次忽略具有非UTF-8名称的文件(在本例中).
如果让它忽略非Ok
个非常规文件的目录条目和路径(因此在file_name()
上返回None
)以及文件名不是UTF-8的文件,它会是这样的:
let paths = fs::read_dir(&Path::new(
&env::current_dir().unwrap())).unwrap();
let names =
paths.filter_map(|entry| {
entry.ok().and_then(|e|
e.path().file_name()
.and_then(|n| n.to_str().map(|s| String::from(s)))
)
}).collect::<Vec<String>>();
playpen
如果您不太熟悉Rust的功能性流量控制功能,例如Result
和Option
上的map
、and_then
等,那么下面是它的扩展,without忽略错误,不进行错误处理.我让你来决定:
let paths = fs::read_dir(&Path::new(
&env::current_dir().unwrap())).unwrap();
let names =
paths.map(|entry| {
let entry = entry.unwrap();
let entry_path = entry.path();
let file_name = entry_path.file_name().unwrap();
let file_name_as_str = file_name.to_str().unwrap();
let file_name_as_string = String::from(file_name_as_str);
file_name_as_string
}).collect::<Vec<String>>();
playpen