文件夹递归扫描

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);
        }
    }
}