如何在Rust中删除指定目录下带有特定后缀名的文件
Rust删除指定目录下所有.html后缀文件的可行实现方案
方案1:仅使用标准库实现(无第三方依赖)
适合不想引入额外依赖的场景,默认仅处理目标目录的直接子文件,不递归子目录:
use std::fs; use std::path::Path; fn delete_html_files(dir_path: &str) -> Result<(), Box<dyn std::error::Error>> { // 读取目录下的所有条目 let entries = fs::read_dir(Path::new(dir_path))?; for entry in entries { let entry = entry?; let path = entry.path(); // 只处理文件,跳过目录 if path.is_file() { // 判断后缀是否为html if let Some(ext) = path.extension() { if ext == "html" { // 执行删除 fs::remove_file(&path)?; println!("已删除: {}", path.display()); } } } } Ok(()) } fn main() -> Result<(), Box<dyn std::error::Error>> { // 替换为你的目标目录路径 let target_dir = "./test_dir"; delete_html_files(target_dir)?; Ok(()) }
注意事项
- 如果需要递归处理子目录,可自行实现递归遍历逻辑,或使用方案2的第三方库简化开发
- 可根据业务需要调整错误处理逻辑,比如跳过无权限访问的文件、记录删除失败的路径等,避免程序直接终止
方案2:使用walkdir第三方库实现(支持递归遍历,代码更简洁)
适合需要递归处理多层子目录的场景,代码更精简,错误处理更友好。
首先在Cargo.toml中添加依赖:
[dependencies] walkdir = "2.5.0"
实现代码:
use std::fs; use walkdir::WalkDir; fn delete_html_files_recursive(dir_path: &str) -> Result<(), Box<dyn std::error::Error>> { // 遍历目录下所有条目,默认递归所有子目录 for entry in WalkDir::new(dir_path) { let entry = entry?; let path = entry.path(); if path.is_file() { if let Some(ext) = path.extension() { if ext == "html" { fs::remove_file(path)?; println!("已删除: {}", path.display()); } } } } Ok(()) } fn main() -> Result<(), Box<dyn std::error::Error>> { // 替换为你的目标目录路径 let target_dir = "./test_dir"; delete_html_files_recursive(target_dir)?; Ok(()) }
注意事项
- 如果不需要递归处理子目录,可在
WalkDir::new(dir_path)后追加.max_depth(1)限制仅遍历第一层目录 - 可通过
filter_entry方法提前过滤不需要遍历的目录,进一步提升遍历效率
可选安全优化
如果担心误删文件,可先收集所有符合条件的文件路径,确认后再执行删除操作:
- 先遍历目录把所有后缀为.html的文件路径存到Vec里
- 打印所有待删除的路径和总数量,等待用户输入确认后再批量执行删除
内容的提问来源于stack exchange,提问作者user17014151
相关产品推荐
相关产品推荐

