file_hashing/
fs.rs

1//! Just wrappers for the filesystem
2
3use std::path::{Path, PathBuf};
4
5pub fn get_all_file_from_folder<P>(path: P) -> Vec<PathBuf>
6where
7    P: AsRef<Path>,
8{
9    let walkdir = walkdir::WalkDir::new(path);
10
11    let result: Vec<_> = walkdir
12        .into_iter()
13        .filter_map(|file| file.ok())
14        .filter(|normal_file| normal_file.metadata().unwrap().is_file())
15        .map(|x| x.into_path())
16        .collect();
17
18    result
19}
20
21/// Extra mod for **benchmark**
22#[cfg(feature = "extra_fs")]
23pub mod extra {
24    use assert_fs::{fixture::ChildPath, prelude::*};
25    use rand::Rng;
26    use std::{cmp, fs::File, io::BufWriter, io::Write};
27
28    pub fn generate_random_file(
29        size: usize,
30    ) -> (assert_fs::TempDir, ChildPath) {
31        let temp = assert_fs::TempDir::new().unwrap();
32        let input_file = temp.child("random_file.txt");
33
34        let f = File::create(input_file.path()).unwrap();
35        let mut writer = BufWriter::new(f);
36
37        let mut rng = rand::thread_rng();
38        let mut buffer = [0; 1024];
39        let mut remaining_size = size;
40
41        while remaining_size > 0 {
42            let to_write = cmp::min(remaining_size, buffer.len());
43            let buffer = &mut buffer[..to_write];
44            rng.fill(buffer);
45            writer.write_all(buffer).unwrap();
46
47            remaining_size -= to_write;
48        }
49
50        (temp, input_file)
51    }
52
53    pub fn generate_random_folder_with_files(
54        value_files: usize,
55        size: usize,
56    ) -> (assert_fs::TempDir, Vec<ChildPath>) {
57        let temp = assert_fs::TempDir::new().unwrap();
58        let mut input_files = Vec::with_capacity(value_files);
59
60        for i in 0..value_files {
61            let input_file = temp.child(format!("random_file_{}.txt", i));
62
63            let f = File::create(input_file.path()).unwrap();
64            let mut writer = BufWriter::new(f);
65
66            let mut rng = rand::thread_rng();
67            let mut buffer = [0; 1024];
68            let mut remaining_size = size;
69
70            while remaining_size > 0 {
71                let to_write = cmp::min(remaining_size, buffer.len());
72                let buffer = &mut buffer[..to_write];
73                rng.fill(buffer);
74                writer.write_all(buffer).unwrap();
75
76                remaining_size -= to_write;
77            }
78
79            input_files.push(input_file);
80        }
81
82        (temp, input_files)
83    }
84}