ファイル、フォルダの取得
fs::read_dir()がファイルの一覧取得
use std::error::Error; use std::fs; use std::path; pub fn read_dir(path: &str) -> Result<Vec<path::PathBuf>, Box<dyn Error>>{ let dir = fs::read_dir(path)?; let mut files: Vec<path::PathBuf> = Vec::new(); for item in dir.into_iter() { files.push(item?.path()); } Ok(files) } fn main() { let files = read_dir("./"); println!("{:?}", files); }
Compiling rust v0.1.0 (/home/vagrant/dev/algorithm/rust)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
Running `target/debug/rust`
Ok([“./target”, “./.gitignore”, “./Cargo.lock”, “./Cargo.toml”, “./.git”, “./src”])
### 再帰的にディレクトリ内のファイルを取得
use std::error::Error; use std::fs; use std::path; pub fn read_dir(path: &path::PathBuf) { let dir = fs::read_dir(path).unwrap(); let mut files: Vec<path::PathBuf> = Vec::new(); for item in dir.into_iter() { let name = item.unwrap().path(); if name.is_dir() { read_dir(&name); } else { files.push(name); } } println!("{:?}", files); } fn main() { let path = path::PathBuf::from("./src"); read_dir(&path); } Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.20s Running `target/debug/rust` ["./src/test/test.rs"] ["./src/binary_search.rs", "./src/linear_search.rs", "./src/fibonacci.rs", "./src/tree_search.rs", "./src/main.rs", "./src/maze.rs", "./src/cardinal.rs", "./src/vending_machine.rs", "./src/fizzbuzz.rs", "./src/8queen.rs", "./src/prime.rs"] これは感覚的に理解しやすいですね。 ### 幅優先探索 再帰で検索するのではなく、ディレクトリをvectorに追加していき、各ディレクトリのファイルをそれぞれ取得していく。答えは同じだが、深さで検索するのではなく、対象を一つ一つ処理していくところが面白い。 fn main() { let mut queue: VecDeque<path::PathBuf> = VecDeque::new(); queue.push_back("./src".into()); let mut files: Vec<path::PathBuf> = Vec::new(); while queue.len() > 0 { let path = queue.pop_front(); let dir = fs::read_dir(path.unwrap()).unwrap(); for item in dir.into_iter() { let name = item.unwrap().path(); if name.is_dir() { queue.push_back(name); } else { files.push(name); } } } println!("{:?}", files); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.42s
Running `target/debug/rust`
["./src/binary_search.rs", "./src/linear_search.rs", "./src/fibonacci.rs", "./src/tree_search.rs", "./src/main.rs", "./src/maze.rs", "./src/cardinal.rs", "./src/vending_machine.rs", "./src/fizzbuzz.rs", "./src/read_dir.rs", "./src/8queen.rs", "./src/prime.rs", "./src/test/test.rs"]