2017-01-11 5 views
0

Pathを読み取り、DirEntryのインスタンスを返す関数を書いています。私が理解していない奇妙な行動があります。あなたのコード例でRustで奇妙なパスの振る舞いを理解できません

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

+0

右が、エラーは削除ライン32&追加されたコメントの後にライン31 – Interaction

+0

でスローされ、https://play.rust-lang.org/?gist=fa07e627043890122ca31fba9b31a96c&version=stable&backtrace=0 – Interaction

+0

私はあなたの新しいリンクが含まれて質問。 – ljedrz

答えて

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("."))を使用すると問題なく動作します。

+0

ありがとうございました!私はちょうど 'PathBuf :: from("。\ todos.txt ")'が 'PathBuf :: from(" todos.txt ")'の代わりにうまく動作するのはなぜですか?私にとっては、これらの2つは同じでなければならないと思います。 – Interaction

+0

私は '。\ todos.txt'と' todos.txt'を同じ​​ものとして扱うことが理にかなっていることに同意します。しかし、現在のドキュメントを[std :: path](https://doc.rust-lang.org/std/path/)で読んでみると、そうではありません。正規化が行われますが、 ''。 ''を加えることはそれらの一つではありません。ただし、これは将来変更される可能性があります。 – wimh

+0

まあ、私は '。\ xx'に固執してますね:) – Interaction