diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index 0bbccbf..5ea5d5f 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -29,6 +29,8 @@ use crate::common_traits::*; use crate::flc; use crate::localizer_core::generate_translation_hashmap; +const TEMP_HARDLINK_FILE: &str = "rzeczek.rxrxrxl"; + #[derive(PartialEq, Eq, Clone, Debug, Copy)] pub enum HashType { Blake3, @@ -1249,12 +1251,13 @@ fn filter_hard_links(vec_file_entry: &[FileEntry]) -> Vec { pub fn make_hard_link(src: &Path, dst: &Path) -> io::Result<()> { let dst_dir = dst.parent().ok_or_else(|| Error::new(ErrorKind::Other, "No parent"))?; - let temp = tempfile::Builder::new().tempfile_in(dst_dir)?; - fs::rename(dst, temp.path())?; + let temp = dst_dir.join(TEMP_HARDLINK_FILE); + fs::rename(dst, temp.as_path())?; let result = fs::hard_link(src, dst); if result.is_err() { - fs::rename(temp.path(), dst)?; + fs::rename(temp.as_path(), dst)?; } + fs::remove_file(temp)?; result } diff --git a/czkawka_gui/src/connect_things/connect_button_hardlink.rs b/czkawka_gui/src/connect_things/connect_button_hardlink.rs index 0bd17d0..75239f9 100644 --- a/czkawka_gui/src/connect_things/connect_button_hardlink.rs +++ b/czkawka_gui/src/connect_things/connect_button_hardlink.rs @@ -12,6 +12,12 @@ use crate::help_functions::*; use crate::localizer_core::generate_translation_hashmap; use crate::notebook_enums::*; +#[derive(PartialEq, Eq)] +enum TypeOfTool { + Hardlinking, + Symlinking, +} + pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { // Hardlinking { @@ -20,7 +26,7 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { let gui_data = gui_data.clone(); buttons_hardlink.connect_clicked(move |_| { - glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), true)); + glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), TypeOfTool::Hardlinking)); }); } @@ -31,12 +37,12 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { let gui_data = gui_data.clone(); buttons_symlink.connect_clicked(move |_| { - glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), false)); + glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), TypeOfTool::Symlinking)); }); } } -pub async fn sym_hard_link_things(gui_data: GuiData, hardlinking: bool) { +async fn sym_hard_link_things(gui_data: GuiData, hardlinking: TypeOfTool) { let notebook_main = gui_data.main_notebook.notebook_main.clone(); let main_tree_views = gui_data.main_notebook.get_main_tree_views(); @@ -90,13 +96,13 @@ pub async fn sym_hard_link_things(gui_data: GuiData, hardlinking: bool) { } } -pub fn hardlink_symlink( +fn hardlink_symlink( tree_view: >k::TreeView, column_file_name: i32, column_path: i32, column_color: i32, column_selection: i32, - hardlinking: bool, + hardlinking: TypeOfTool, text_view_errors: &TextView, ) { reset_text_view(text_view_errors); @@ -192,13 +198,19 @@ pub fn hardlink_symlink( break; } } - if hardlinking { + if hardlinking == TypeOfTool::Hardlinking { for symhardlink_data in vec_symhardlink_data { for file_to_hardlink in symhardlink_data.files_to_symhardlink { + // #[cfg(target_family = "unix")] if let Err(e) = make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) { add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str()); continue; } + // #[cfg(target_family = "windows")] + // if let Err(e) = fs::hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) { + // add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str()); + // continue; + // } } } } else {