Fix not removing from GUI empty folders which contains another empty folder
This commit is contained in:
parent
8bbb12c7d4
commit
9c4a7fbb9f
|
@ -18,6 +18,7 @@ use gtk::prelude::*;
|
|||
use gtk::{Builder, SelectionMode, TreeIter, TreeView};
|
||||
use std::cell::RefCell;
|
||||
use std::collections::HashMap;
|
||||
use std::fs::Metadata;
|
||||
use std::rc::Rc;
|
||||
use std::{env, fs, process, thread};
|
||||
|
||||
|
@ -423,7 +424,7 @@ fn main() {
|
|||
let excluded_items = entry_excluded_items.get_text().as_str().to_string();
|
||||
let allowed_extensions = entry_allowed_extensions.get_text().as_str().to_string();
|
||||
|
||||
hide_all_buttons_except("stop", &buttons_array, &buttons_names); // TODO Stop should do something
|
||||
hide_all_buttons_except("stop", &buttons_array, &buttons_names);
|
||||
|
||||
// Disable main notebook from any iteraction until search will end
|
||||
notebook_main.set_sensitive(false);
|
||||
|
@ -625,12 +626,64 @@ fn main() {
|
|||
let name = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), ColumnsEmptyFolders::Name as i32).get::<String>().unwrap().unwrap();
|
||||
let path = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), ColumnsEmptyFolders::Path as i32).get::<String>().unwrap().unwrap();
|
||||
|
||||
// TODO this should be fs::remove_dir_all(), because it doesn't delete folders with empty folders inside
|
||||
match fs::remove_dir(format!("{}/{}", path, name)) {
|
||||
Ok(_) => {
|
||||
list_store.remove(&list_store.get_iter(tree_path).unwrap());
|
||||
// We must check if folder is really empty or contains only other empty folders
|
||||
let mut error_happened = false;
|
||||
let mut folders_to_check: Vec<String> = vec![format!("{}/{}", path, name)];
|
||||
let mut current_folder: String;
|
||||
let mut next_folder: String;
|
||||
'dir: while !folders_to_check.is_empty() {
|
||||
current_folder = folders_to_check.pop().unwrap();
|
||||
let read_dir = match fs::read_dir(¤t_folder) {
|
||||
Ok(t) => t,
|
||||
Err(_) => {
|
||||
error_happened = true;
|
||||
break 'dir;
|
||||
}
|
||||
};
|
||||
|
||||
for entry in read_dir {
|
||||
let entry_data = match entry {
|
||||
Ok(t) => t,
|
||||
Err(_) => {
|
||||
error_happened = true;
|
||||
break 'dir;
|
||||
}
|
||||
};
|
||||
let metadata: Metadata = match entry_data.metadata() {
|
||||
Ok(t) => t,
|
||||
Err(_) => {
|
||||
error_happened = true;
|
||||
break 'dir;
|
||||
}
|
||||
};
|
||||
if metadata.is_dir() {
|
||||
next_folder = "".to_owned()
|
||||
+ ¤t_folder
|
||||
+ "/"
|
||||
+ match &entry_data.file_name().into_string() {
|
||||
Ok(t) => t,
|
||||
Err(_) => {
|
||||
error_happened = true;
|
||||
break 'dir;
|
||||
}
|
||||
};
|
||||
folders_to_check.push(next_folder.clone());
|
||||
} else {
|
||||
error_happened = true;
|
||||
}
|
||||
}
|
||||
Err(_) => messages += format!("Failed to remove folder {}/{} because folder doesn't exists, you don't have permissions or isn't empty.\n", path, name).as_str(),
|
||||
}
|
||||
|
||||
if !error_happened {
|
||||
match fs::remove_dir_all(format!("{}/{}", path, name)) {
|
||||
Ok(_) => {
|
||||
list_store.remove(&list_store.get_iter(tree_path).unwrap());
|
||||
}
|
||||
Err(_) => error_happened = true,
|
||||
}
|
||||
}
|
||||
if error_happened {
|
||||
messages += format!("Failed to remove folder {}/{} because folder doesn't exists, you don't have permissions or isn't empty.\n", path, name).as_str()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue