Rust 文件夹递归描源码
use std::fs;
use std::env;
fn main() {
// 获取当前目录
let current_path = match env::current_dir() {
Ok(path) => path.to_string_lossy().to_string(),
Err(e) => {
println!("Error: {}", e);
return;
}
};
println!("Current Path: {}", current_path);
// 实例化 DirEntry 结构体
let mut entry = DirEntry {
path: current_path.clone(),
is_dir: false,
sub_dirs: vec![],
};
entry.scan_dir();
entry.list_dir();
}
#[derive(Debug)]
struct DirEntry {
path: String, // 路径
is_dir: bool, // 是否为目录
sub_dirs: Vec<DirEntry>, // 子目录
}
impl DirEntry {
// 扫描当前目录下的所有文件和目录
fn scan_dir(&mut self) {
// 获取当前目录下的所有文件和目录
if let Ok(dir) = fs::read_dir(&self.path) {
for entry in dir {
match entry {
Ok(entry) => {
if let Ok(file_type) = entry.file_type() {
if file_type.is_dir() {
self.is_dir = true;
// 如果是目录,则递归列出子目录下的文件和目录
let mut sub_entry = DirEntry {
path: entry.path().to_string_lossy().to_string(),
is_dir: true,
sub_dirs: vec![],
};
sub_entry.scan_dir();
self.sub_dirs.push(sub_entry);
} else {
// 如果是文件,也应将其添加到子目录列表中
self.sub_dirs.push(DirEntry {
path: entry.path().to_string_lossy().to_string(),
is_dir: false,
sub_dirs: vec![],
});
}
}
}
Err(e) => println!("Error: {}", e),
}
}
} else {
println!("Error reading directory: {}", self.path);
}
}
// 以树状形式展示目录结构
fn list_dir(&self) {
if self.is_dir {
println!("{}", self.path);
for sub_entry in &self.sub_dirs {
println!("{:>4} {}", "|--", sub_entry.path);
if sub_entry.is_dir {
sub_entry.list_dir();
} else {
println!("{:>4} {}", "|--", sub_entry.path);
}
}
} else {
println!("{}", self.path);
}
}
}