diff --git a/czkawka_core/src/big_file.rs b/czkawka_core/src/big_file.rs index f418cf5..c06e34e 100644 --- a/czkawka_core/src/big_file.rs +++ b/czkawka_core/src/big_file.rs @@ -17,6 +17,7 @@ use rayon::prelude::*; use crate::common::split_path; use crate::common::{Common, LOOP_DURATION}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -202,44 +203,21 @@ impl BigFile { let mut dir_result = vec![]; let mut warnings = vec![]; let mut fe_result = vec![]; - // Read current dir children - let read_dir = match fs::read_dir(current_folder) { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_open_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - return (dir_result, warnings, fe_result); - } + + let Some(read_dir) = common_read_dir(current_folder, &mut warnings) else { + return (dir_result, warnings, fe_result); }; // Check every sub folder/file/link etc. for entry in read_dir { - let entry_data = match entry { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_entry_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue; - } - }; - let metadata: Metadata = match entry_data.metadata() { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_metadata_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue; - } + let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { + continue; }; + if metadata.is_dir() { - self.check_folder_children(&mut dir_result, &mut warnings, current_folder, &entry_data); + self.check_folder_children(&mut dir_result, &mut warnings, current_folder, entry_data); } else if metadata.is_file() { - self.collect_file_entry(&atomic_counter, &metadata, &entry_data, &mut fe_result, &mut warnings, current_folder); + self.collect_file_entry(&atomic_counter, &metadata, entry_data, &mut fe_result, &mut warnings, current_folder); } } (dir_result, warnings, fe_result) diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index 6210e8d..889db54 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -1,5 +1,5 @@ use std::collections::BTreeMap; -use std::fs::{File, Metadata}; +use std::fs::{DirEntry, File}; use std::io::prelude::*; use std::io::{BufReader, BufWriter}; use std::path::{Path, PathBuf}; @@ -19,6 +19,7 @@ use serde::{Deserialize, Serialize}; use crate::common::{create_crash_message, open_cache_folder, Common, LOOP_DURATION, PDF_FILES_EXTENSIONS}; use crate::common::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -260,64 +261,19 @@ impl BrokenFiles { let mut dir_result = vec![]; let mut warnings = vec![]; let mut fe_result = vec![]; - // Read current dir children - let read_dir = match fs::read_dir(current_folder) { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_open_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - return (dir_result, warnings, fe_result); - } + + let Some(read_dir) = common_read_dir(current_folder, &mut warnings) else { + return (dir_result, warnings, fe_result); }; // Check every sub folder/file/link etc. 'dir: for entry in read_dir { - let entry_data = match entry { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_entry_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } - }; - let metadata: Metadata = match entry_data.metadata() { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_metadata_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } + let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { + continue; }; + if metadata.is_dir() { - if !self.recursive_search { - continue 'dir; - } - - let next_folder = current_folder.join(entry_data.file_name()); - if self.directories.is_excluded(&next_folder) { - continue 'dir; - } - - if self.excluded_items.is_excluded(&next_folder) { - continue 'dir; - } - - #[cfg(target_family = "unix")] - if self.directories.exclude_other_filesystems() { - match self.directories.is_on_other_filesystems(&next_folder) { - Ok(true) => continue 'dir, - Err(e) => warnings.push(e.to_string()), - _ => (), - } - } - - dir_result.push(next_folder); + self.check_folder_children(&mut dir_result, &mut warnings, current_folder, entry_data); } else if metadata.is_file() { atomic_counter.fetch_add(1, Ordering::Relaxed); @@ -404,6 +360,31 @@ impl BrokenFiles { Common::print_time(start_time, SystemTime::now(), "check_files"); true } + pub fn check_folder_children(&self, dir_result: &mut Vec, warnings: &mut Vec, current_folder: &Path, entry_data: &DirEntry) { + if !self.recursive_search { + return; + } + + let next_folder = current_folder.join(entry_data.file_name()); + if self.directories.is_excluded(&next_folder) { + return; + } + + if self.excluded_items.is_excluded(&next_folder) { + return; + } + + #[cfg(target_family = "unix")] + if self.directories.exclude_other_filesystems() { + match self.directories.is_on_other_filesystems(&next_folder) { + Ok(true) => return, + Err(e) => warnings.push(e), + _ => (), + } + } + + dir_result.push(next_folder); + } fn look_for_broken_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender>) -> bool { let system_time = SystemTime::now(); diff --git a/czkawka_core/src/common_dir_traversal.rs b/czkawka_core/src/common_dir_traversal.rs index 4a7ed99..5755ca3 100644 --- a/czkawka_core/src/common_dir_traversal.rs +++ b/czkawka_core/src/common_dir_traversal.rs @@ -1,16 +1,16 @@ use std::collections::BTreeMap; -use std::fs::Metadata; +use std::fs::{DirEntry, Metadata, ReadDir}; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::Arc; +use std::fs; use std::time::{SystemTime, UNIX_EPOCH}; -use std::{fs}; use crossbeam_channel::Receiver; use rayon::prelude::*; -use crate::common::{prepare_thread_handler_common}; +use crate::common::prepare_thread_handler_common; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -373,40 +373,17 @@ where let mut fe_result = vec![]; let mut set_as_not_empty_folder_list = vec![]; let mut folder_entries_list = vec![]; - // Read current dir children - let read_dir = match fs::read_dir(current_folder) { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_open_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - return (dir_result, warnings, fe_result, set_as_not_empty_folder_list, folder_entries_list); - } + + let Some(read_dir) = common_read_dir(current_folder, &mut warnings) else { + return (dir_result, warnings, fe_result, set_as_not_empty_folder_list, folder_entries_list); }; // Check every sub folder/file/link etc. 'dir: for entry in read_dir { - let entry_data = match entry { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_entry_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } - }; - let metadata: Metadata = match entry_data.metadata() { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_metadata_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } + let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { + continue; }; + match (entry_type(&metadata), collect) { (EntryType::Dir, Collect::Files | Collect::InvalidSymlinks) => { if !recursive_search { @@ -703,6 +680,42 @@ where } } +pub fn common_read_dir(current_folder: &Path, warnings: &mut Vec) -> Option { + match fs::read_dir(current_folder) { + Ok(t) => Some(t), + Err(e) => { + warnings.push(flc!( + "core_cannot_open_dir", + generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) + )); + None + } + } +} +pub fn common_get_entry_data_metadata<'a>(entry: &'a Result, warnings: &mut Vec, current_folder: &Path) -> Option<(&'a DirEntry, Metadata)> { + let entry_data = match entry { + Ok(t) => t, + Err(e) => { + warnings.push(flc!( + "core_cannot_read_entry_dir", + generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) + )); + return None; + } + }; + let metadata: Metadata = match entry_data.metadata() { + Ok(t) => t, + Err(e) => { + warnings.push(flc!( + "core_cannot_read_metadata_dir", + generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) + )); + return None; + } + }; + Some((entry_data, metadata)) +} + fn set_as_not_empty_folder(folder_entries: &mut BTreeMap, current_folder: &Path) { // Not folder so it may be a file or symbolic link so it isn't empty folder_entries.get_mut(current_folder).unwrap().is_empty = FolderEmptiness::No; diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index 2932d95..15c4f95 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -1,5 +1,5 @@ use std::collections::{BTreeSet, HashMap, HashSet}; -use std::fs::{File, Metadata}; +use std::fs::{DirEntry, File}; use std::io::Write; use std::io::*; use std::panic; @@ -8,7 +8,7 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::Arc; use std::thread::{sleep, JoinHandle}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use std::{fs, mem, thread}; +use std::{mem, thread}; use bk_tree::BKTree; use crossbeam_channel::Receiver; @@ -25,6 +25,7 @@ use crate::common::{ create_crash_message, get_dynamic_image_from_raw_image, get_number_of_threads, open_cache_folder, Common, HEIC_EXTENSIONS, IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS, LOOP_DURATION, RAW_IMAGE_EXTENSIONS, }; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -351,64 +352,19 @@ impl SimilarImages { let mut dir_result = vec![]; let mut warnings = vec![]; let mut fe_result = vec![]; - // Read current dir children - let read_dir = match fs::read_dir(current_folder) { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_open_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - return (dir_result, warnings, fe_result); - } + + let Some(read_dir) = common_read_dir(current_folder, &mut warnings) else { + return (dir_result, warnings, fe_result); }; // Check every sub folder/file/link etc. 'dir: for entry in read_dir { - let entry_data = match entry { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_entry_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } - }; - let metadata: Metadata = match entry_data.metadata() { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_metadata_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } + let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { + continue; }; + if metadata.is_dir() { - if !self.recursive_search { - continue 'dir; - } - - let next_folder = current_folder.join(entry_data.file_name()); - if self.directories.is_excluded(&next_folder) { - continue 'dir; - } - - if self.excluded_items.is_excluded(&next_folder) { - continue 'dir; - } - - #[cfg(target_family = "unix")] - if self.directories.exclude_other_filesystems() { - match self.directories.is_on_other_filesystems(&next_folder) { - Ok(true) => continue 'dir, - Err(e) => warnings.push(e.to_string()), - _ => (), - } - } - - dir_result.push(next_folder); + self.check_folder_children(&mut dir_result, &mut warnings, current_folder, entry_data); } else if metadata.is_file() { atomic_counter.fetch_add(1, Ordering::Relaxed); @@ -1029,6 +985,31 @@ impl SimilarImages { pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } + pub fn check_folder_children(&self, dir_result: &mut Vec, warnings: &mut Vec, current_folder: &Path, entry_data: &DirEntry) { + if !self.recursive_search { + return; + } + + let next_folder = current_folder.join(entry_data.file_name()); + if self.directories.is_excluded(&next_folder) { + return; + } + + if self.excluded_items.is_excluded(&next_folder) { + return; + } + + #[cfg(target_family = "unix")] + if self.directories.exclude_other_filesystems() { + match self.directories.is_on_other_filesystems(&next_folder) { + Ok(true) => return, + Err(e) => warnings.push(e), + _ => (), + } + } + + dir_result.push(next_folder); + } } fn image_to_check<'a>( diff --git a/czkawka_core/src/similar_videos.rs b/czkawka_core/src/similar_videos.rs index f11461a..aa9aa67 100644 --- a/czkawka_core/src/similar_videos.rs +++ b/czkawka_core/src/similar_videos.rs @@ -1,5 +1,5 @@ use std::collections::{BTreeMap, BTreeSet, HashMap}; -use std::fs::{File, Metadata}; +use std::fs::{DirEntry, File}; use std::io::Write; use std::io::*; use std::path::{Path, PathBuf}; @@ -7,7 +7,7 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::Arc; use std::thread::{sleep, JoinHandle}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use std::{fs, mem, thread}; +use std::{mem, thread}; use crossbeam_channel::Receiver; use ffmpeg_cmdline_utils::FfmpegErrorKind::FfmpegNotFound; @@ -20,6 +20,7 @@ use vid_dup_finder_lib::{NormalizedTolerance, VideoHash}; use crate::common::VIDEO_FILES_EXTENSIONS; use crate::common::{open_cache_folder, Common, LOOP_DURATION}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -316,64 +317,19 @@ impl SimilarVideos { let mut dir_result = vec![]; let mut warnings = vec![]; let mut fe_result = vec![]; - // Read current dir children - let read_dir = match fs::read_dir(current_folder) { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_open_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - return (dir_result, warnings, fe_result); - } + + let Some(read_dir) = common_read_dir(current_folder, &mut warnings) else { + return (dir_result, warnings, fe_result); }; // Check every sub folder/file/link etc. 'dir: for entry in read_dir { - let entry_data = match entry { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_entry_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } - }; - let metadata: Metadata = match entry_data.metadata() { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_metadata_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } + let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { + continue; }; + if metadata.is_dir() { - if !self.recursive_search { - continue 'dir; - } - - let next_folder = current_folder.join(entry_data.file_name()); - if self.directories.is_excluded(&next_folder) { - continue 'dir; - } - - if self.excluded_items.is_excluded(&next_folder) { - continue 'dir; - } - - #[cfg(target_family = "unix")] - if self.directories.exclude_other_filesystems() { - match self.directories.is_on_other_filesystems(&next_folder) { - Ok(true) => continue 'dir, - Err(e) => warnings.push(e.to_string()), - _ => (), - } - } - - dir_result.push(next_folder); + self.check_folder_children(&mut dir_result, &mut warnings, current_folder, entry_data); } else if metadata.is_file() { atomic_counter.fetch_add(1, Ordering::Relaxed); @@ -455,6 +411,31 @@ impl SimilarVideos { true } + pub fn check_folder_children(&self, dir_result: &mut Vec, warnings: &mut Vec, current_folder: &Path, entry_data: &DirEntry) { + if !self.recursive_search { + return; + } + + let next_folder = current_folder.join(entry_data.file_name()); + if self.directories.is_excluded(&next_folder) { + return; + } + + if self.excluded_items.is_excluded(&next_folder) { + return; + } + + #[cfg(target_family = "unix")] + if self.directories.exclude_other_filesystems() { + match self.directories.is_on_other_filesystems(&next_folder) { + Ok(true) => return, + Err(e) => warnings.push(e), + _ => (), + } + } + + dir_result.push(next_folder); + } fn sort_videos(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender>) -> bool { let hash_map_modification = SystemTime::now(); diff --git a/czkawka_core/src/temporary.rs b/czkawka_core/src/temporary.rs index 93cb7ee..92f2523 100644 --- a/czkawka_core/src/temporary.rs +++ b/czkawka_core/src/temporary.rs @@ -1,7 +1,7 @@ -use std::fs::{File, Metadata}; +use std::fs::{DirEntry, File, Metadata}; use std::io::prelude::*; use std::io::BufWriter; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::Arc; use std::thread::{sleep, JoinHandle}; @@ -12,6 +12,7 @@ use crossbeam_channel::Receiver; use rayon::prelude::*; use crate::common::{Common, LOOP_DURATION}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir}; use crate::common_directory::Directories; use crate::common_items::ExcludedItems; use crate::common_messages::Messages; @@ -189,129 +190,23 @@ impl Temporary { let mut dir_result = vec![]; let mut warnings = vec![]; let mut fe_result = vec![]; - // Read current dir children - let read_dir = match fs::read_dir(current_folder) { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_open_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - return (dir_result, warnings, fe_result); - } + + let Some(read_dir) = common_read_dir(current_folder, &mut warnings) else { + return (dir_result, warnings, fe_result); }; // Check every sub folder/file/link etc. - 'dir: for entry in read_dir { - let entry_data = match entry { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_entry_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } - }; - let metadata: Metadata = match entry_data.metadata() { - Ok(t) => t, - Err(e) => { - warnings.push(flc!( - "core_cannot_read_metadata_dir", - generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) - )); - continue 'dir; - } + for entry in read_dir { + let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { + continue; }; + if metadata.is_dir() { - if !self.recursive_search { - continue 'dir; - } - - let next_folder = current_folder.join(entry_data.file_name()); - if self.directories.is_excluded(&next_folder) { - continue 'dir; - } - - if self.excluded_items.is_excluded(&next_folder) { - continue 'dir; - } - - #[cfg(target_family = "unix")] - if self.directories.exclude_other_filesystems() { - match self.directories.is_on_other_filesystems(&next_folder) { - Ok(true) => continue 'dir, - Err(e) => warnings.push(e.to_string()), - _ => (), - } - } - - dir_result.push(next_folder); + self.check_folder_children(&mut dir_result, &mut warnings, current_folder, entry_data); } else if metadata.is_file() { - atomic_counter.fetch_add(1, Ordering::Relaxed); - - let file_name_lowercase: String = match entry_data.file_name().into_string() { - Ok(t) => t, - Err(_inspected) => { - warnings.push(flc!( - "core_file_not_utf8_name", - generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) - )); - continue 'dir; - } + if let Some(file_entry) = self.get_file_entry(&metadata, &atomic_counter, entry_data, &mut warnings, current_folder) { + fe_result.push(file_entry); } - .to_lowercase(); - - if ![ - "#", - "thumbs.db", - ".bak", - "~", - ".tmp", - ".temp", - ".ds_store", - ".crdownload", - ".part", - ".cache", - ".dmp", - ".download", - ".partial", - ] - .iter() - .any(|f| file_name_lowercase.ends_with(f)) - { - continue 'dir; - } - let current_file_name = current_folder.join(entry_data.file_name()); - if self.excluded_items.is_excluded(¤t_file_name) { - continue 'dir; - } - - // Creating new file entry - let fe: FileEntry = FileEntry { - path: current_file_name.clone(), - modified_date: match metadata.modified() { - Ok(t) => match t.duration_since(UNIX_EPOCH) { - Ok(d) => d.as_secs(), - Err(_inspected) => { - warnings.push(flc!( - "core_file_modified_before_epoch", - generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) - )); - 0 - } - }, - Err(e) => { - warnings.push(flc!( - "core_file_no_modification_date", - generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) - )); - 0 - } // Permissions Denied - }, - }; - - fe_result.push(fe); } } (dir_result, warnings, fe_result) @@ -339,6 +234,103 @@ impl Temporary { Common::print_time(start_time, SystemTime::now(), "check_files_size"); true } + pub fn get_file_entry( + &self, + metadata: &Metadata, + atomic_counter: &Arc, + entry_data: &DirEntry, + warnings: &mut Vec, + current_folder: &Path, + ) -> Option { + atomic_counter.fetch_add(1, Ordering::Relaxed); + + let file_name_lowercase: String = match entry_data.file_name().into_string() { + Ok(t) => t, + Err(_inspected) => { + warnings.push(flc!( + "core_file_not_utf8_name", + generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) + )); + return None; + } + } + .to_lowercase(); + + if ![ + "#", + "thumbs.db", + ".bak", + "~", + ".tmp", + ".temp", + ".ds_store", + ".crdownload", + ".part", + ".cache", + ".dmp", + ".download", + ".partial", + ] + .iter() + .any(|f| file_name_lowercase.ends_with(f)) + { + return None; + } + let current_file_name = current_folder.join(entry_data.file_name()); + if self.excluded_items.is_excluded(¤t_file_name) { + return None; + } + + // Creating new file entry + Some(FileEntry { + path: current_file_name.clone(), + modified_date: match metadata.modified() { + Ok(t) => match t.duration_since(UNIX_EPOCH) { + Ok(d) => d.as_secs(), + Err(_inspected) => { + warnings.push(flc!( + "core_file_modified_before_epoch", + generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) + )); + 0 + } + }, + Err(e) => { + warnings.push(flc!( + "core_file_no_modification_date", + generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) + )); + 0 + } // Permissions Denied + }, + }) + } + + pub fn check_folder_children(&self, dir_result: &mut Vec, warnings: &mut Vec, current_folder: &Path, entry_data: &DirEntry) { + if !self.recursive_search { + return; + } + + let next_folder = current_folder.join(entry_data.file_name()); + if self.directories.is_excluded(&next_folder) { + return; + } + + if self.excluded_items.is_excluded(&next_folder) { + return; + } + + #[cfg(target_family = "unix")] + if self.directories.exclude_other_filesystems() { + match self.directories.is_on_other_filesystems(&next_folder) { + Ok(true) => return, + Err(e) => warnings.push(e), + _ => (), + } + } + + dir_result.push(next_folder); + } /// Function to delete files, from filed Vector fn delete_files(&mut self) {