ファイル、フォルダの取得
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"]