mod.rs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use std::path::PathBuf;
  2. pub mod cargo_handler;
  3. pub struct FileUtils;
  4. impl FileUtils {
  5. /// 列出指定目录下的所有文件
  6. ///
  7. /// ## 参数
  8. ///
  9. /// - `path` - 指定的目录
  10. /// - `ext_name` - 文件的扩展名,如果为None,则列出所有文件
  11. /// - `recursive` - 是否递归列出所有文件
  12. pub fn list_all_files(path: &PathBuf, ext_name: Option<&str>, recursive: bool) -> Vec<PathBuf> {
  13. let mut queue: Vec<PathBuf> = Vec::new();
  14. let mut result = Vec::new();
  15. queue.push(path.clone());
  16. while !queue.is_empty() {
  17. let path = queue.pop().unwrap();
  18. let d = std::fs::read_dir(path);
  19. if d.is_err() {
  20. continue;
  21. }
  22. let d = d.unwrap();
  23. d.for_each(|ent| {
  24. if let Ok(ent) = ent {
  25. if let Ok(file_type) = ent.file_type() {
  26. if file_type.is_file() {
  27. if let Some(e) = ext_name {
  28. if let Some(ext) = ent.path().extension() {
  29. if ext == e {
  30. result.push(ent.path());
  31. }
  32. }
  33. }
  34. } else if file_type.is_dir() && recursive {
  35. queue.push(ent.path());
  36. }
  37. }
  38. }
  39. });
  40. }
  41. return result;
  42. }
  43. }