diff --git a/include/core/import_export.h b/include/core/import_export.h index 954f4a0..e4cc9a4 100644 --- a/include/core/import_export.h +++ b/include/core/import_export.h @@ -2,6 +2,7 @@ #define IMPORT_EXPORT_H #include "utils/string_ext.h" +#include "utils/error_code.h" #define EXPORT_VERSION "1.0" @@ -11,9 +12,9 @@ typedef struct { } ExportData; // 导出 PATH 到文件 -int export_paths_to_file(const ExportData *data, const char *filepath); +ErrorCode export_paths_to_file(const ExportData *data, const char *filepath); -// 从文件导入 PATH (返回是否包含全部格式) -int import_paths_from_file(const char *filepath, ExportData *data); +// 从文件导入 PATH +ErrorCode import_paths_from_file(const char *filepath, ExportData *data); #endif // IMPORT_EXPORT_H \ No newline at end of file diff --git a/include/core/path_manager.h b/include/core/path_manager.h index ce3724f..dcdb0e4 100644 --- a/include/core/path_manager.h +++ b/include/core/path_manager.h @@ -2,18 +2,18 @@ #define PATH_MANAGER_H #include "utils/string_ext.h" +#include "utils/error_code.h" // 移除列表中指定索引的项 -void path_manager_remove_at(StringList *list, int index); +ErrorCode path_manager_remove_at(StringList *list, int index); // 上移指定索引的项 -void path_manager_move_up(StringList *list, int index); +ErrorCode path_manager_move_up(StringList *list, int index); // 下移指定索引的项 -void path_manager_move_down(StringList *list, int index); +ErrorCode path_manager_move_down(StringList *list, int index); // 清理无效和重复的路径 -// 返回被清理的项数 -int path_manager_clean(StringList *list); +ErrorCode path_manager_clean(StringList *list); #endif // PATH_MANAGER_H diff --git a/src/controller/callbacks.c b/src/controller/callbacks.c index e0d2e07..a9bf9e5 100644 --- a/src/controller/callbacks.c +++ b/src/controller/callbacks.c @@ -158,7 +158,11 @@ int btn_del_cb(Ihandle *self) } StringList *raw_data = get_current_raw_data(dlg); - path_manager_remove_at(raw_data, selected - 1); + ErrorCode result = path_manager_remove_at(raw_data, selected - 1); + if (result != ERR_OK) + { + log_error("Failed to remove path at index %d", selected - 1); + } sync_string_list_to_ui(current_list, raw_data); @@ -179,7 +183,11 @@ int btn_up_cb(Ihandle *self) return IUP_DEFAULT; StringList *raw_data = get_current_raw_data(dlg); - path_manager_move_up(raw_data, selected - 1); + ErrorCode result = path_manager_move_up(raw_data, selected - 1); + if (result != ERR_OK) + { + log_error("Failed to move path up at index %d", selected - 1); + } sync_string_list_to_ui(current_list, raw_data); IupSetInt(current_list, "VALUE", selected - 1); @@ -198,7 +206,11 @@ int btn_down_cb(Ihandle *self) if (selected == 0 || selected >= raw_data->count) return IUP_DEFAULT; - path_manager_move_down(raw_data, selected - 1); + ErrorCode result = path_manager_move_down(raw_data, selected - 1); + if (result != ERR_OK) + { + log_error("Failed to move path down at index %d", selected - 1); + } sync_string_list_to_ui(current_list, raw_data); IupSetInt(current_list, "VALUE", selected + 1); @@ -219,7 +231,9 @@ int btn_clean_cb(Ihandle *self) return IUP_DEFAULT; } - int removed = path_manager_clean(raw_data); + int before_count = raw_data->count; + path_manager_clean(raw_data); + int removed = before_count - raw_data->count; Ihandle *current_list = get_current_list(dlg); sync_string_list_to_ui(current_list, raw_data); @@ -391,7 +405,8 @@ int btn_import_cb(Ihandle *self) if (filepath) { ExportData imported; - if (import_paths_from_file(filepath, &imported) == 0) + ErrorCode import_result = import_paths_from_file(filepath, &imported); + if (import_result == ERR_OK) { int has_system = imported.system.count > 0; int has_user = imported.user.count > 0; @@ -453,6 +468,7 @@ int btn_import_cb(Ihandle *self) } else { + log_error("Import failed: error code %d", import_result); IupMessage("错误", "导入失败,请检查文件格式是否正确!"); } } @@ -502,7 +518,8 @@ int btn_export_cb(Ihandle *self) } filepath = final_path; - if (export_paths_to_file(&data, filepath) == 0) + ErrorCode export_result = export_paths_to_file(&data, filepath); + if (export_result == ERR_OK) { char msg[512]; snprintf(msg, sizeof(msg), "成功导出!\n系统变量: %d 个\n用户变量: %d 个\n\n保存位置: %s", @@ -511,6 +528,7 @@ int btn_export_cb(Ihandle *self) } else { + log_error("Export failed: error code %d", export_result); IupMessage("错误", "导出失败!"); } } diff --git a/src/core/import_export.c b/src/core/import_export.c index 3712a1f..7770b21 100644 --- a/src/core/import_export.c +++ b/src/core/import_export.c @@ -1,5 +1,7 @@ #include "core/import_export.h" #include "utils/os_env.h" +#include "utils/error_code.h" +#include "utils/logger.h" #include #include #include @@ -59,14 +61,17 @@ static char *escape_json_string(const char *str) } // 导出路径数据到 JSON 文件 -int export_paths_to_file(const ExportData *data, const char *filepath) +ErrorCode export_paths_to_file(const ExportData *data, const char *filepath) { if (!data || !filepath) - return -1; + return ERR_NULL_PTR; FILE *fp = fopen(filepath, "w"); if (!fp) - return -1; + { + log_error("Failed to open file for export: %s", filepath); + return ERR_FILE_NOT_FOUND; + } fprintf(fp, "\xEF\xBB\xBF"); @@ -111,7 +116,9 @@ int export_paths_to_file(const ExportData *data, const char *filepath) fprintf(fp, "}\n"); fclose(fp); - return 0; + log_info("Exported paths to file: sys=%d, user=%d, file=%s", + data->system.count, data->user.count, filepath); + return ERR_OK; } // 移除字符串首尾的空格、制表符、换行符和回车符 @@ -148,11 +155,11 @@ static int is_json_file(const char *filepath) return ext && strcasecmp(ext, ".json") == 0; } -// 从文件导入 PATH (返回是否包含全部格式) -int import_paths_from_file(const char *filepath, ExportData *data) +// 从文件导入 PATH +ErrorCode import_paths_from_file(const char *filepath, ExportData *data) { if (!filepath || !data) - return -1; + return ERR_NULL_PTR; init_string_list(&data->system); init_string_list(&data->user); @@ -161,7 +168,10 @@ int import_paths_from_file(const char *filepath, ExportData *data) { FILE *fp = fopen(filepath, "rb"); if (!fp) - return -1; + { + log_error("Failed to open file for import: %s", filepath); + return ERR_FILE_NOT_FOUND; + } StringList list; init_string_list(&list); @@ -178,12 +188,16 @@ int import_paths_from_file(const char *filepath, ExportData *data) fclose(fp); data->system = list; - return 0; + log_info("Imported paths from TXT file: %d paths, file=%s", list.count, filepath); + return ERR_OK; } FILE *fp = fopen(filepath, "rb"); if (!fp) - return -1; + { + log_error("Failed to open file for import: %s", filepath); + return ERR_FILE_NOT_FOUND; + } char buffer[8192]; int in_system = 0; @@ -292,5 +306,7 @@ int import_paths_from_file(const char *filepath, ExportData *data) } fclose(fp); - return 0; + log_info("Imported paths from JSON file: sys=%d, user=%d, file=%s", + data->system.count, data->user.count, filepath); + return ERR_OK; } \ No newline at end of file diff --git a/src/core/path_manager.c b/src/core/path_manager.c index 2cc9d40..abaddd3 100644 --- a/src/core/path_manager.c +++ b/src/core/path_manager.c @@ -1,51 +1,57 @@ #include "core/path_manager.h" #include "utils/os_env.h" +#include "utils/error_code.h" +#include "utils/logger.h" #include #include // 删除指定索引的路径项 -void path_manager_remove_at(StringList *list, int index) +ErrorCode path_manager_remove_at(StringList *list, int index) { if (!list || index < 0 || index >= list->count) - return; + return ERR_NULL_PTR; free(list->items[index]); for (int i = index; i < list->count - 1; i++) { list->items[i] = list->items[i + 1]; } + list->items[list->count - 1] = NULL; list->count--; + return ERR_OK; } // 向上移动路径项 -void path_manager_move_up(StringList *list, int index) +ErrorCode path_manager_move_up(StringList *list, int index) { if (!list || index <= 0 || index >= list->count) - return; + return ERR_NULL_PTR; char *temp = list->items[index]; list->items[index] = list->items[index - 1]; list->items[index - 1] = temp; + return ERR_OK; } // 向下移动路径项 -void path_manager_move_down(StringList *list, int index) +ErrorCode path_manager_move_down(StringList *list, int index) { if (!list || index < 0 || index >= list->count - 1) - return; + return ERR_NULL_PTR; char *temp = list->items[index]; list->items[index] = list->items[index + 1]; list->items[index + 1] = temp; + return ERR_OK; } // 清理无效路径项 -int path_manager_clean(StringList *list) +ErrorCode path_manager_clean(StringList *list) { - if (!list) return 0; + if (!list) return ERR_NULL_PTR; + int removed_count = 0; - // 从后往前遍历,方便删除 for (int i = list->count - 1; i >= 0; i--) { char *item = list->items[i]; @@ -53,14 +59,12 @@ int path_manager_clean(StringList *list) int should_remove = 0; - // 1. 检查有效性 if (!is_path_valid(item)) { should_remove = 1; } else { - // 2. 检查重复 (检查当前项之前是否出现过) for (int j = 0; j < i; j++) { char *prev_item = list->items[j]; @@ -78,5 +82,8 @@ int path_manager_clean(StringList *list) removed_count++; } } - return removed_count; + + log_info("Cleaned paths: removed %d invalid/duplicate paths, remaining %d", + removed_count, list->count); + return ERR_OK; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 510d106..65a635e 100644 --- a/src/main.c +++ b/src/main.c @@ -18,7 +18,7 @@ cmake --build build !打包命令: build_installer.bat !运行命令: -build\\PathEditor.exe +powershell -Command "Start-Process 'build\\PathEditor.exe' -Verb RunAs" */ // 定义 Windows 消息常量