无法弄清楚Rust中奇怪的Path行为

时间:2017-01-11 07:35:14

标签: file-io rust

我正在编写一个读取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"))
}

Full code on the Rust playground

1 个答案:

答案 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("."))它会很好。