Simplifying
This commit is contained in:
parent
30adc4542c
commit
3ca2e40fcf
|
@ -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)
|
||||
|
|
|
@ -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<PathBuf>, warnings: &mut Vec<String>, 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<ProgressData>>) -> bool {
|
||||
let system_time = SystemTime::now();
|
||||
|
||||
|
|
|
@ -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<String>) -> Option<ReadDir> {
|
||||
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<DirEntry, std::io::Error>, warnings: &mut Vec<String>, 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<PathBuf, FolderEntry>, 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;
|
||||
|
|
|
@ -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<String>) {
|
||||
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
|
||||
}
|
||||
pub fn check_folder_children(&self, dir_result: &mut Vec<PathBuf>, warnings: &mut Vec<String>, 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>(
|
||||
|
|
|
@ -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<PathBuf>, warnings: &mut Vec<String>, 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<ProgressData>>) -> bool {
|
||||
let hash_map_modification = SystemTime::now();
|
||||
|
||||
|
|
|
@ -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<AtomicUsize>,
|
||||
entry_data: &DirEntry,
|
||||
warnings: &mut Vec<String>,
|
||||
current_folder: &Path,
|
||||
) -> Option<FileEntry> {
|
||||
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<PathBuf>, warnings: &mut Vec<String>, 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) {
|
||||
|
|
Loading…
Reference in a new issue