我正在编写一个读取Path
并返回DirEntry
实例的函数。我不明白有些奇怪的行为。
pub fn file_to_direntry<T: AsRef<Path>>(filepath: T) -> Result<DirEntry, Box<Error>> {
match filepath.has_parent() {
Some(parent) => {
//..
}
// has no parent
// this line would cause an error
// Err(Error { repr: Os { code: 2, message: "No such file or directory" } })
None => path_to_entry(Path::new("."), path),
}
}
fn path_to_entry<A: AsRef<Path>, B: AsRef<Path>>(path: A, filename: B) -> Result<DirEntry, Box<Error>> {
let filename: &Path = filename.as_ref();
let path: &Path = path.as_ref();
// this line prints, "" "."
println!("{:?} {:?}", path, PathBuf::from("."));
// when I replace this line to
// for entry in try!(read_dir(PathBuf::from(".")))
// it works perfectly fine
for entry in try!(read_dir(path)) {
println!("{:?}", try!(entry));
}
Err(From::from("no file found"))
}
答案 0 :(得分:0)
在您的示例代码中,您使用PathBuf::from("todos.txt")
进行测试。这是一个相对路径,它不包含起始/
或c:\
。
执行let parent = pf.parent();
后,它将返回Some("")
。所以父母是一个空字符串,而不是Some(".")
,也不是None
。如果路径以根或前缀终止,parent
将仅返回None
。在上面的示例中,您只包含None
部分,但不会调用它。
read_dir
将返回错误。当你传递像read_dir(PathBuf::from(""))
这样的空字符串时就是这种情况,但是如果你使用read_dir(PathBuf::from("."))
它会很好。