duplicate_finder/
path_files.rs

1use std::{cell::RefCell, path::PathBuf, rc::Rc};
2
3pub fn get_all_file_paths<T>(into_path_buf: T) -> Vec<PathBuf>
4where
5    T: Into<PathBuf>,
6{
7    let ref_cell = &mut RefCell::new(Vec::new());
8    let rc = Rc::new(ref_cell);
9    get_all_file_paths_recursive(into_path_buf, Rc::clone(&rc));
10    let clone = rc.borrow_mut().clone();
11    clone
12}
13
14fn get_all_file_paths_recursive<T>(path_buf: T, vec: Rc<&mut RefCell<Vec<PathBuf>>>)
15where
16    T: Into<PathBuf>,
17{
18    let read_dir = std::fs::read_dir(path_buf.into());
19
20    if let Ok(read_dir) = read_dir {
21        for dir_entry in read_dir {
22            if let Ok(dir_entry) = dir_entry {
23                let metadata = dir_entry.metadata().expect("Can't get file metadata.");
24                let path_of_entry = dir_entry.path();
25                let path_of_entry_clone = path_of_entry.clone();
26
27                if metadata.is_file() {
28                    vec.borrow_mut().push(path_of_entry_clone);
29                } else if metadata.is_dir() {
30                    get_all_file_paths_recursive(path_of_entry, Rc::clone(&vec));
31                }
32            }
33        }
34    }
35}