diff --git a/dir.c b/dir.c index f2edd75..65715bc 100644 --- a/dir.c +++ b/dir.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "sorting.h" #include "defines.h" @@ -25,6 +26,7 @@ linked_dir *current_dir; unsigned long get_dir_size(char *path); void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_content); void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file *dir_content); +char recursive_delete(file current_file); @@ -370,3 +372,29 @@ void dir_init(){ current_dir = visited_dirs; } + +char recursive_delete(file current_file){ + if (current_file.file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) { + unsigned int file_modifiers_tmp = file_modifiers; + file_modifiers |= FILE_MODIFIERS_HIDDEN_FILES; + unsigned long current_file_count = get_dir_size(current_file.file_name); + if (current_file_count != 0) { + file *current_dir = malloc(current_file_count * sizeof(file)); + memset(current_dir, '\0', current_file_count * sizeof(file)); + get_dir_content(current_file.file_name, ¤t_file_count, current_dir); + chdir(current_file.file_name); + unsigned long i; + for (i = 0; i < current_file_count; i++) { + recursive_delete(current_dir[i]); + free(current_dir[i].file_name); + } + free(current_dir); + chdir(".."); + } + remove(current_file.file_name); + file_modifiers = file_modifiers_tmp; + + } else { + remove(current_file.file_name); + } +} diff --git a/dir.h b/dir.h index 17e35ce..c9de1cf 100644 --- a/dir.h +++ b/dir.h @@ -10,3 +10,4 @@ char update_selected_file(); void dir_set_selected_file_current(unsigned long selected_file_current); unsigned long dir_get_selected_file_current(); void dir_init(); +char recursive_delete(file current_file); diff --git a/interactions.c b/interactions.c index 6842233..364447a 100644 --- a/interactions.c +++ b/interactions.c @@ -433,32 +433,22 @@ void delete(){ if (ch == 'y' || ch == 'Y') { /* TODO(2025-06-30T02:27:06) IMPORTANT: this really fucks up when the file has a quotation mark in its name */ - int error; if (hits) { - int j = 2; for (i = 0; i < mid_file_count; i++) { if (mid_content[i].status & FILE_STATUS_SELECTED) { - error = remove(mid_content[i].file_name); - if (error != 0) { - mvaddstr(terminal_height-j, 0, "could not delete: " ); - mvaddstr(terminal_height-j, strlen("could not delete: "), mid_content[i].file_name); - j++; - } + recursive_delete(mid_content[i]); } } free(btm_buffer); btm_buffer = concat("deleted: ", file_str); } else { free(btm_buffer); - error = remove(mid_content[selected_file_current].file_name); - if (error != 0) { - mvaddstr(terminal_height-2, 0, "could not delete: " ); - mvaddstr(terminal_height-2, strlen("could not delete: "), mid_content[i].file_name); - btm_buffer = " "; - } else { - btm_buffer = concat("deleted: \"", mid_content[selected_file_current].file_name); - btm_buffer = concat(btm_buffer, "\""); - } + if (mid_content[selected_file_current].file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) { + recursive_delete(mid_content[selected_file_current]); + } + remove(mid_content[selected_file_current].file_name); + btm_buffer = concat("deleted: \"", mid_content[selected_file_current].file_name); + btm_buffer = concat(btm_buffer, "\""); } /*system(cmd);*/