1
0
Fork 0
mirror of synced 2024-05-19 03:43:00 +12:00

Add support for multithreading to zeroed files (#101)

This commit is contained in:
Rafał Mikrut 2020-11-08 19:01:48 +01:00 committed by GitHub
parent f359905ebc
commit 3e61544ec4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 92 additions and 46 deletions

View file

@ -11,6 +11,7 @@ use crate::common_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::common_traits::*; use crate::common_traits::*;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use rayon::prelude::*;
#[derive(Eq, PartialEq, Clone, Debug)] #[derive(Eq, PartialEq, Clone, Debug)]
pub enum DeleteMethod { pub enum DeleteMethod {
@ -54,6 +55,7 @@ pub struct ZeroedFiles {
delete_method: DeleteMethod, delete_method: DeleteMethod,
stopped_search: bool, stopped_search: bool,
minimal_file_size: u64, minimal_file_size: u64,
files_to_check: Vec<FileEntry>,
} }
impl ZeroedFiles { impl ZeroedFiles {
@ -69,6 +71,7 @@ impl ZeroedFiles {
delete_method: DeleteMethod::None, delete_method: DeleteMethod::None,
stopped_search: false, stopped_search: false,
minimal_file_size: 1024, minimal_file_size: 1024,
files_to_check: Vec::with_capacity(1024),
} }
} }
@ -78,6 +81,10 @@ impl ZeroedFiles {
self.stopped_search = true; self.stopped_search = true;
return; return;
} }
if !self.check_for_zeroed_files(stop_receiver) {
self.stopped_search = true;
return;
}
self.delete_files(); self.delete_files();
self.debug_print(); self.debug_print();
} }
@ -210,49 +217,6 @@ impl ZeroedFiles {
continue 'dir; continue 'dir;
} }
let mut file_handler: File = match File::open(&current_file_name) {
Ok(t) => t,
Err(_) => {
continue 'dir;
}
};
let mut first_search: bool = true;
let mut n;
loop {
if first_search {
let mut buffer = [0u8; 64];
n = match file_handler.read(&mut buffer) {
Ok(t) => t,
Err(_) => {
continue 'dir;
}
};
for i in buffer[0..n].iter() {
if *i != 0 {
continue 'dir; // Not zeroed file
}
}
first_search = false;
} else {
let mut buffer = [0u8; 1024 * 32];
n = match file_handler.read(&mut buffer) {
Ok(t) => t,
Err(_) => {
continue 'dir;
}
};
for i in buffer[0..n].iter() {
if *i != 0 {
continue 'dir; // Not zeroed file
}
}
}
if n == 0 {
break;
}
}
// Creating new file entry // Creating new file entry
let fe: FileEntry = FileEntry { let fe: FileEntry = FileEntry {
path: current_file_name.clone(), path: current_file_name.clone(),
@ -273,7 +237,7 @@ impl ZeroedFiles {
}; };
// Adding files to Vector // Adding files to Vector
self.zeroed_files.push(fe); self.files_to_check.push(fe);
self.information.number_of_checked_files += 1; self.information.number_of_checked_files += 1;
} else { } else {
@ -282,12 +246,78 @@ impl ZeroedFiles {
} }
} }
} }
self.information.number_of_zeroed_files = self.zeroed_files.len();
Common::print_time(start_time, SystemTime::now(), "check_files".to_string()); Common::print_time(start_time, SystemTime::now(), "check_files".to_string());
true true
} }
/// Check files for files which have 0
fn check_for_zeroed_files(&mut self, stop_receiver: Option<&Receiver<()>>) -> bool {
let start_time: SystemTime = SystemTime::now();
self.zeroed_files = self
.files_to_check
.par_iter()
.map(|file_entry| {
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
// This will not break
return None;
}
let file_entry = file_entry.clone();
let mut n;
let mut file_handler: File = match File::open(&file_entry.path) {
Ok(t) => t,
Err(_) => {
return Some(None);
}
};
// First search
let mut buffer = [0u8; 64];
n = match file_handler.read(&mut buffer) {
Ok(t) => t,
Err(_) => {
return Some(None);
}
};
for i in buffer[0..n].iter() {
if *i != 0 {
return Some(None);
}
}
// Second search
loop {
let mut buffer = [0u8; 1024 * 32];
n = match file_handler.read(&mut buffer) {
Ok(t) => t,
Err(_) => {
return Some(None);
}
};
for i in buffer[0..n].iter() {
if *i != 0 {
return Some(None);
}
}
if n == 0 {
break;
}
}
Some(Some(file_entry))
})
.while_some()
.filter(|file_entry| file_entry.is_some())
.map(|file_entry| file_entry.unwrap())
.collect::<Vec<_>>();
self.information.number_of_zeroed_files = self.zeroed_files.len();
Common::print_time(start_time, SystemTime::now(), "search for zeroed_files".to_string());
true
}
/// Function to delete files, from filed Vector /// Function to delete files, from filed Vector
fn delete_files(&mut self) { fn delete_files(&mut self) {
let start_time: SystemTime = SystemTime::now(); let start_time: SystemTime = SystemTime::now();

View file

@ -54,6 +54,7 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone(); let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone(); let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_zeroed_files_finder = gui_data.scrolled_window_zeroed_files_finder.clone(); let scrolled_window_zeroed_files_finder = gui_data.scrolled_window_zeroed_files_finder.clone();
let text_view_errors = gui_data.text_view_errors.clone();
buttons_search_clone.connect_clicked(move |_| { buttons_search_clone.connect_clicked(move |_| {
let included_directories = get_string_from_list_store(&scrolled_window_included_directories); let included_directories = get_string_from_list_store(&scrolled_window_included_directories);
@ -72,6 +73,7 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() { match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => { "notebook_main_duplicate_finder_label" => {
get_list_store(&scrolled_window_duplicate_finder).clear(); get_list_store(&scrolled_window_duplicate_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let check_method; let check_method;
if radio_button_duplicates_name.get_active() { if radio_button_duplicates_name.get_active() {
@ -108,6 +110,8 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
} }
"scrolled_window_main_empty_folder_finder" => { "scrolled_window_main_empty_folder_finder" => {
get_list_store(&scrolled_window_main_empty_folder_finder).clear(); get_list_store(&scrolled_window_main_empty_folder_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let sender = sender.clone(); let sender = sender.clone();
let receiver_stop = stop_receiver.clone(); let receiver_stop = stop_receiver.clone();
@ -123,6 +127,8 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
} }
"scrolled_window_main_empty_files_finder" => { "scrolled_window_main_empty_files_finder" => {
get_list_store(&scrolled_window_main_empty_files_finder).clear(); get_list_store(&scrolled_window_main_empty_files_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let sender = sender.clone(); let sender = sender.clone();
let receiver_stop = stop_receiver.clone(); let receiver_stop = stop_receiver.clone();
@ -141,6 +147,8 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
} }
"scrolled_window_main_temporary_files_finder" => { "scrolled_window_main_temporary_files_finder" => {
get_list_store(&scrolled_window_main_temporary_files_finder).clear(); get_list_store(&scrolled_window_main_temporary_files_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let sender = sender.clone(); let sender = sender.clone();
let receiver_stop = stop_receiver.clone(); let receiver_stop = stop_receiver.clone();
@ -158,6 +166,8 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
} }
"notebook_big_main_file_finder" => { "notebook_big_main_file_finder" => {
get_list_store(&scrolled_window_big_files_finder).clear(); get_list_store(&scrolled_window_big_files_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let numbers_of_files_to_check = match entry_big_files_number.get_text().as_str().parse::<usize>() { let numbers_of_files_to_check = match entry_big_files_number.get_text().as_str().parse::<usize>() {
Ok(t) => t, Ok(t) => t,
Err(_) => 50, // By default Err(_) => 50, // By default
@ -182,6 +192,8 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
"notebook_main_similar_images_finder_label" => { "notebook_main_similar_images_finder_label" => {
get_list_store(&scrolled_window_similar_images_finder).clear(); get_list_store(&scrolled_window_similar_images_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let sender = sender.clone(); let sender = sender.clone();
let receiver_stop = stop_receiver.clone(); let receiver_stop = stop_receiver.clone();
@ -219,6 +231,8 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
} }
"notebook_main_zeroed_files_finder" => { "notebook_main_zeroed_files_finder" => {
get_list_store(&scrolled_window_zeroed_files_finder).clear(); get_list_store(&scrolled_window_zeroed_files_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let sender = sender.clone(); let sender = sender.clone();
let receiver_stop = stop_receiver.clone(); let receiver_stop = stop_receiver.clone();
@ -237,6 +251,8 @@ pub fn connect_button_search(gui_data: &GuiData, sender: Sender<Message>) {
} }
"notebook_main_same_music_finder" => { "notebook_main_same_music_finder" => {
get_list_store(&scrolled_window_same_music_finder).clear(); get_list_store(&scrolled_window_same_music_finder).clear();
text_view_errors.get_buffer().unwrap().set_text("");
let minimal_file_size = match entry_same_music_minimal_size.get_text().as_str().parse::<u64>() { let minimal_file_size = match entry_same_music_minimal_size.get_text().as_str().parse::<u64>() {
Ok(t) => t, Ok(t) => t,
Err(_) => 1024, // By default Err(_) => 1024, // By default

View file

@ -265,7 +265,7 @@ pub fn startup_configuration(gui_data: &GuiData) {
// Set Excluded Items // Set Excluded Items
{ {
if cfg!(target_family = "unix") { if cfg!(target_family = "unix") {
entry_excluded_items.set_text("*/.git/*,*/node_modules/*,*/lost+found/*"); entry_excluded_items.set_text("*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*");
} }
if cfg!(target_family = "windows") { if cfg!(target_family = "windows") {
entry_excluded_items.set_text("*/.git/*,*/node_modules/*,*/lost+found/*,*:/windows/*"); entry_excluded_items.set_text("*/.git/*,*/node_modules/*,*/lost+found/*,*:/windows/*");