# BlueCoastWebsiteTools **Repository Path**: tinywo/blue_coast_website_tools ## Basic Information - **Project Name**: BlueCoastWebsiteTools - **Description**: BlueCoastWebsiteTools - **Primary Language**: Python - **License**: WTFPL - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-26 - **Last Updated**: 2026-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FTP 系统类型检测工具 ## 项目概述 本工具用于自动检测FTP服务器上各个网站的CMS系统类型,识别新迅睿系统、旧迅睿系统和织梦系统,并记录需要升级的旧迅睿系统。 ## 功能特性 - ✅ 自动连接FTP服务器并遍历根目录 - ✅ 智能检测系统类型(新迅睿、旧迅睿、织梦) - ✅ 缓存机制提高效率,支持自动更新 - ✅ 自动记录需要升级的系统到日志文件 - ✅ 实时检测FTP服务器文件列表变化 - ✅ 详细的检测报告和统计信息 - ✅ 入口文件自动对比和覆盖功能 - ✅ 指定目录入口文件检查和替换 - ✅ 支持同时匹配带www.和不带www.的目录 - ✅ 完整的操作日志记录系统 - ✅ 图片批量压缩功能,支持PNG/JPG/JPEG转WebP - ✅ 图片优化功能,调整大小和分辨率 ## 文件结构 ``` tools/ ├── main.py # 主程序 ├── folder_cache.json # 文件夹列表缓存 ├── php/ # 入口文件模板目录 │ ├── xunrui/ # 新迅睿系统入口文件 │ │ └── public/ │ │ ├── index.php │ │ ├── m/index.php │ │ └── mobile/index.php │ ├── old_xunrui/ # 旧迅睿系统入口文件 │ │ ├── index.php │ │ ├── m/index.php │ │ └── mobile/index.php │ └── dedecms/ # 织梦系统入口文件 │ ├── index.php │ ├── m/index.php │ └── mobile/index.php ├── test/ # 测试脚本目录 │ └── script/ # 测试脚本 │ ├── test_cache.py │ ├── test_cache_change.py │ ├── test_delete_index_html.py │ ├── test_error_handling.py │ ├── test_log_functions.py │ └── test_menu.py ├── logs/ # 日志文件目录 │ ├── upgrade_needed.log # 需要升级的系统日志 │ ├── entry_file_operations.log # 入口文件操作日志 │ └── index_html_deletion.log # index.html 删除日志 └── doc/ # 文档目录 ├── README.md # 完整文档 └── QUICK_REFERENCE.md # 快速参考指南 ``` ## 系统类型判断规则 ### 新迅睿系统 - **特征**: 存在 `dayrui` 和 `public` 文件夹,不存在 `index.php` 文件 - **状态**: 正常,无需升级 ### 旧迅睿系统 - **特征**: 存在 `dayrui` 和 `index.php`,不存在 `public` 文件夹 - **状态**: 需要升级 - **处理**: 自动记录到 `upgrade_needed.log` ### 织梦系统 - **特征**: 存在 `admin_lhht`、`include` 和 `data` 文件夹 - **状态**: 正常 ### 未知系统 - **特征**: 不符合以上任何特征 - **状态**: 需要人工检查 ## 核心功能详解 ### 1. FTP连接管理 #### `connect_ftp(host, port, username, password)` 连接FTP服务器 **参数**: - `host`: FTP服务器地址 - `port`: 端口号(默认21) - `username`: 用户名 - `password`: 密码 **返回**: FTP连接对象或None **示例**: ```python ftp = connect_ftp('YOUR_FTP_SERVER_IP', 21, 'YOUR_FTP_USERNAME', 'YOUR_FTP_PASSWORD') ``` ### 2. 文件夹列表获取 #### `get_folder_list(ftp, path='/')` 获取指定路径下的所有文件夹 **参数**: - `ftp`: FTP连接对象 - `path`: 路径(默认根目录'/') **返回**: 文件夹名称列表 **示例**: ```python folder_list = get_folder_list(ftp, '/') ``` ### 3. 缓存管理 #### `save_folder_cache(folder_list, cache_file='folder_cache.json')` 将文件夹列表保存到缓存文件 **参数**: - `folder_list`: 文件夹列表 - `cache_file`: 缓存文件路径 **返回**: 成功返回True,失败返回False #### `load_folder_cache(cache_file='folder_cache.json', max_age_hours=24)` 从缓存文件加载文件夹列表 **参数**: - `cache_file`: 缓存文件路径 - `max_age_hours`: 缓存最大有效期(小时) **返回**: 文件夹列表或None(缓存无效) #### `is_cache_valid(cache_file='folder_cache.json', max_age_hours=24)` 检查缓存是否有效 **参数**: - `cache_file`: 缓存文件路径 - `max_age_hours`: 缓存最大有效期(小时) **返回**: 有效返回True,无效返回False ### 4. 变化检测 #### `compare_folder_lists(old_list, new_list)` 比较两个文件夹列表的差异 **参数**: - `old_list`: 旧文件夹列表 - `new_list`: 新文件夹列表 **返回**: (added_folders, removed_folders, has_changes) **示例**: ```python added, removed, has_changes = compare_folder_lists(old_list, new_list) if has_changes: print(f"新增: {added}") print(f"删除: {removed}") ``` #### `check_and_update_cache(ftp, cache_file='folder_cache.json', max_age_hours=24)` 检查FTP服务器文件列表是否发生变化,如有变化则更新缓存 **参数**: - `ftp`: FTP连接对象 - `cache_file`: 缓存文件路径 - `max_age_hours`: 缓存最大有效期(小时) **返回**: (folder_list, cache_updated) **工作流程**: 1. 尝试从缓存加载 2. 如果缓存无效,直接获取新列表并保存 3. 如果缓存有效,获取FTP列表并比较 4. 检测到变化时更新缓存 5. 返回最新的文件夹列表 ### 5. 系统类型检测 #### `detect_system_type(ftp, folder_name)` 检测指定文件夹的系统类型 **参数**: - `ftp`: FTP连接对象 - `folder_name`: 文件夹名称 **返回**: - `'new_xunrui'` - 新迅睿系统 - `'old_xunrui'` - 旧迅睿系统 - `'dedecms'` - 织梦系统 - `'unknown'` - 未知系统 **检测逻辑**: ```python has_dayrui = 'dayrui' in contents has_public = 'public' in contents has_index_php = 'index.php' in contents has_admin_lhht = 'admin_lhht' in contents has_include = 'include' in contents has_data = 'data' in contents if has_dayrui and has_public and not has_index_php: return 'new_xunrui' elif has_dayrui and has_index_php and not has_public: return 'old_xunrui' elif has_admin_lhht and has_include and has_data: return 'dedecms' else: return 'unknown' ``` #### `scan_all_folders(ftp, folder_list)` 遍历所有文件夹并检测系统类型 **参数**: - `ftp`: FTP连接对象 - `folder_list`: 文件夹列表 **返回**: 检测结果字典 ```python { 'new_xunrui': [...], # 新迅睿系统列表 'old_xunrui': [...], # 旧迅睿系统列表 'dedecms': [...], # 织梦系统列表 'unknown': [...] # 未知系统列表 } ``` ### 6. 日志记录 #### `log_upgrade_needed(folder_name, system_type)` 记录需要升级的系统到日志文件 **参数**: - `folder_name`: 文件夹名称 - `system_type`: 系统类型 **日志格式**: ``` [2026-01-04 15:21:23] 文件夹: xaclz.com, 系统类型: 旧迅睿系统, 需要升级 ``` #### `log_entry_file_operation(log_file, folder_name, system_type, operation, file_path, status, details="")` 记录入口文件操作日志 **参数**: - `log_file`: 日志文件路径 - `folder_name`: 文件夹名称 - `system_type`: 系统类型 - `operation`: 操作类型 (upload/skip/error/start) - `file_path`: 文件路径 - `status`: 状态描述 - `details`: 详细信息 **日志格式**: ``` [2026-01-04 17:08:21] 文件夹: test_folder, 系统: new_xunrui, 操作: upload, 文件: /index.php, 状态: 文件内容不一致, 详情: 本地文件: php/xunrui/public/index.php ``` #### `log_entry_file_summary(log_file, total_upload, total_skip, total_error, processed_count)` 记录入口文件操作汇总日志 **参数**: - `log_file`: 日志文件路径 - `total_upload`: 上传文件数 - `total_skip`: 跳过文件数 - `total_error`: 错误文件数 - `processed_count`: 处理文件夹数 #### `print_summary(results)` 打印检测结果摘要 **参数**: - `results`: 检测结果字典 **输出格式**: ``` ================================================================================ 检测结果摘要: ================================================================================ 新迅睿系统: 39 个 - ylhyqc.com - ... 旧迅睿系统 (需要升级): 44 个 - xaclz.com - ... 织梦系统: 87 个 - xathqc.com - ... 未知系统: 15 个 - www.gsmgny.com - ... ================================================================================ ``` ### 7. 入口文件对比和覆盖 #### `get_entry_files_for_system(system_type)` 根据系统类型获取需要对比的入口文件列表 **参数**: - `system_type`: 系统类型 ('new_xunrui'/'old_xunrui'/'dedecms'/'unknown') **返回**: [(local_path, ftp_path), ...] **文件映射**: - **新迅睿系统**: - `php/xunrui/public/index.php` → `/index.php` - `php/xunrui/public/m/index.php` → `/m/index.php` - `php/xunrui/public/mobile/index.php` → `/mobile/index.php` - **旧迅睿系统**: - `php/old_xunrui/index.php` → `/index.php` - `php/old_xunrui/m/index.php` → `/m/index.php` - `php/old_xunrui/mobile/index.php` → `/mobile/index.php` - **织梦系统**: - `php/dedecms/index.php` → `/index.php` - `php/dedecms/m/index.php` → `/m/index.php` - `php/dedecms/mobile/index.php` → `/mobile/index.php` ### 8. 图片批量压缩 #### `convert_images_to_webp(change_extension=False)` 将指定目录下的所有图片文件转换为WebP格式,并保存到新目录中。 **参数**: - `change_extension`: 是否将文件扩展名改为.webp(默认:False,保持原扩展名) **功能特性**: - 支持批量转换常见图片格式(PNG/JPG/JPEG → WebP) - 保留原始目录层级结构 - 实时进度条显示(tqdm实现) - 自动创建目标目录 - 异常文件跳过机制 **使用方法**: ```bash python main.py # 然后选择图片批量压缩功能 ``` ### 9. 图片优化 #### `optimize_image(local_file_path, output_file_path)` 优化图片:调整大小、分辨率和转换为webp格式 **参数**: - `local_file_path`: 原始图片路径 - `output_file_path`: 输出图片路径(保持原扩展名) **优化步骤**: 1. 调整分辨率为72dpi 2. 调整图片大小: - 宽度大于1920px,调整为1920px - 其他图片宽度大于750px,调整为500px 3. 转换为webp格式,保持原扩展名 #### `process_images_for_folder(ftp, folder_name, log_file)` 处理单个new_xunrui文件夹的图片优化 **参数**: - `ftp`: FTP连接对象 - `folder_name`: 文件夹名称 - `log_file`: 日志文件路径 **返回**: (optimized_count, skipped_count, error_count) **功能特性**: - 自动处理指定文件夹的图片 - 下载、优化、上传一条龙服务 - 详细的日志记录 - 错误处理机制 #### `batch_optimize_images(ftp, folder_list, system_types_dict, log_file)` 批量处理所有new_xunrui文件夹的图片优化 **参数**: - `ftp`: FTP连接对象 - `folder_list`: 文件夹列表 - `system_types_dict`: 系统类型字典 - `log_file`: 日志文件路径 **返回**: (total_optimized, total_skipped, total_error) **功能特性**: - 批量处理多个文件夹 - 详细的进度显示 - 完整的日志记录 - 统计结果输出 #### `read_local_file(file_path)` 读取本地文件内容 **参数**: - `file_path`: 本地文件路径 **返回**: 文件内容字符串或None #### `read_ftp_file(ftp, file_path)` 读取FTP文件内容 **参数**: - `ftp`: FTP连接对象 - `file_path`: FTP文件路径 **返回**: 文件内容字符串或None #### `compare_files(local_content, ftp_content)` 比较本地和FTP文件内容是否一致 **参数**: - `local_content`: 本地文件内容 - `ftp_content`: FTP文件内容 **返回**: (is_different, reason) #### `upload_file_to_ftp(ftp, local_file_path, ftp_file_path)` 上传文件到FTP **参数**: - `ftp`: FTP连接对象 - `local_file_path`: 本地文件路径 - `ftp_file_path`: FTP文件路径 **返回**: 成功返回True,失败返回False #### `compare_and_upload_entry_files(ftp, folder_name, system_type, log_file='entry_file_operations.log')` 对比并上传入口文件 **参数**: - `ftp`: FTP连接对象 - `folder_name`: 文件夹名称 - `system_type`: 系统类型 - `log_file`: 日志文件路径 **返回**: (upload_count, skip_count, error_count) **工作流程**: 1. 根据系统类型获取需要对比的文件列表 2. 遍历每个文件: - 检查本地文件是否存在 - 读取本地文件内容 - 读取FTP文件内容 - 比较文件内容 - 如果FTP文件不存在,跳过 - 如果文件内容不一致,上传覆盖 - 如果文件内容一致,跳过 3. 记录所有操作到日志文件 4. 返回统计结果 #### `process_entry_files(ftp, folder_list, system_types_dict, log_file='entry_file_operations.log')` 处理所有文件夹的入口文件对比 **参数**: - `ftp`: FTP连接对象 - `folder_list`: 文件夹列表 - `system_types_dict`: 系统类型字典 {folder_name: system_type} - `log_file`: 日志文件路径 **返回**: ```python { 'processed_folders': 处理文件夹数, 'uploaded_files': 上传文件数, 'skipped_files': 跳过文件数, 'error_files': 错误文件数 } ``` **工作流程**: 1. 遍历所有文件夹 2. 跳过未知系统的文件夹 3. 进入文件夹目录 4. 调用 compare_and_upload_entry_files 进行文件对比和上传 5. 返回根目录 6. 记录汇总日志 7. 返回统计结果 ## 配置说明 ### FTP服务器配置 在 `main()` 函数中修改以下配置: ```python # FTP服务器配置 FTP_HOST = 'YOUR_FTP_SERVER_IP' # FTP服务器地址 FTP_PORT = 21 # 端口号 FTP_USER = 'YOUR_FTP_USERNAME' # 用户名 FTP_PASSWORD = 'YOUR_FTP_PASSWORD' # 密码 ``` ### 缓存配置 ```python # 缓存配置 CACHE_FILE = 'folder_cache.json' # 缓存文件路径 CACHE_MAX_AGE_HOURS = 24 # 缓存有效期(小时) ``` ## 使用方法 ### 基本使用 ```bash python main.py ``` ### 程序执行流程 1. **连接FTP服务器** - 建立FTP连接 - 验证登录信息 2. **检查并更新缓存** - 尝试加载缓存文件 - 检查缓存是否在有效期内 - 获取FTP当前文件夹列表 - 比较缓存和实际列表 - 检测到变化时更新缓存 3. **系统类型检测** - 遍历所有文件夹 - 进入每个文件夹检测系统类型 - 记录检测结果 4. **生成报告** - 打印详细检测过程 - 输出统计摘要 - 保存需要升级的系统到日志 5. **入口文件对比和覆盖** - 遍历所有已知系统类型的文件夹 - 根据系统类型获取对应的入口文件列表 - 对比本地文件和FTP文件内容 - 如果文件内容不一致,上传本地文件覆盖FTP文件 - 如果FTP文件不存在,跳过该文件 - 如果文件内容一致,跳过该文件 - 记录所有操作到日志文件 - 输出汇总统计信息 ### 输出示例 ``` 连接FTP服务器... 成功连接到FTP服务器: YOUR_FTP_SERVER_IP 从缓存加载文件夹列表(缓存时间: 2026-01-04 15:39:22) 检查FTP服务器文件列表是否发生变化... 找到 186 个文件夹: - . - .. - www.gsmgny.com - ... 文件列表未发生变化,使用缓存 开始检测系统类型... ================================================================================ 检测文件夹: www.gsmgny.com 系统类型: 未知系统 检测文件夹: ylhyqc.com 系统类型: 新迅睿系统 检测文件夹: xaclz.com 系统类型: 旧迅睿系统 (需要升级) 已记录到日志: xaclz.com 需要升级 ... ================================================================================ 检测结果摘要: ================================================================================ 新迅睿系统: 39 个 旧迅睿系统 (需要升级): 44 个 织梦系统: 87 个 未知系统: 15 个 ================================================================================ 需要升级的系统已记录到: logs/upgrade_needed.log ================================================================================ 开始处理入口文件对比... ================================================================================ 处理文件夹: ylhyqc.com (new_xunrui) 开始对比入口文件 (3 个): ✓ 一致: /index.php ✓ 一致: /m/index.php ✓ 一致: /mobile/index.php 处理文件夹: xaclz.com (old_xunrui) 开始对比入口文件 (3 个): → 需要更新: /index.php (文件内容不一致) ✓ 上传成功: /xaclz.com/index.php → 需要更新: /m/index.php (文件内容不一致) ✓ 上传成功: /xaclz.com/m/index.php ⊘ 跳过: /mobile/index.php (FTP文件不存在) ... ================================================================================ 入口文件处理完成: 处理文件夹: 83 个 上传文件: 15 个 跳过文件: 234 个 错误文件: 0 个 ================================================================================ 入口文件操作日志已记录到: logs/entry_file_operations.log FTP连接已关闭 ``` ### 指定目录入口文件检查和替换 ``` ================================================================================ 指定目录入口文件检查和替换 ================================================================================ 请输入要处理的目录名称(多个目录用空格分隔): 示例: www.fengrongtec.com www.gsbyx.com jpdlkj.com 请输入目录名称: www.fengrongtec.com www.gsbyx.com jpdlkj.com 输入的目录: www.fengrongtec.com, www.gsbyx.com, jpdlkj.com 找到匹配的目录 (6 个): - www.fengrongtec.com (new_xunrui) - fengrongtec.com (new_xunrui) - www.gsbyx.com (new_xunrui) - gsbyx.com (new_xunrui) - jpdlkj.com (new_xunrui) - www.jpdlkj.com (new_xunrui) 是否继续处理这些目录?(y/n): y ================================================================================ [2026-01-04 20:00:00] 开始处理指定目录入口文件 输入目录: www.fengrongtec.com www.gsbyx.com jpdlkj.com 匹配目录: www.fengrongtec.com fengrongtec.com www.gsbyx.com gsbyx.com jpdlkj.com www.jpdlkj.com ================================================================================ 处理文件夹: www.fengrongtec.com (new_xunrui) 开始对比入口文件 (3 个): ✓ 一致: /index.php ✓ 一致: /m/index.php ✓ 一致: /mobile/index.php 处理文件夹: fengrongtec.com (new_xunrui) 开始对比入口文件 (3 个): → 需要更新: /index.php (文件内容不一致) ✓ 上传成功: /fengrongtec.com/index.php ✓ 一致: /m/index.php ✓ 一致: /mobile/index.php ... ================================================================================ 指定目录入口文件处理完成: 处理文件夹: 6 个 上传文件: 1 个 跳过文件: 17 个 错误文件: 0 个 ================================================================================ 入口文件操作日志已记录到: logs/entry_file_operations.log ``` ## 缓存机制 ### 缓存文件格式 `folder_cache.json`: ```json { "timestamp": "2026-01-04 19:17:23", "folder_list": [ { "name": "ylhyqc.com", "system_type": "new_xunrui" }, { "name": "xaclz.com", "system_type": "old_xunrui" }, ... ], "version": "2.0" } ``` ### 缓存更新策略 1. **首次运行**: 无缓存,获取FTP列表并保存 2. **后续运行(24小时内)**: - 加载缓存 - 直接使用缓存数据,不检查FTP服务器变化 - 如果所有文件夹的系统类型都已缓存,直接使用缓存结果 - 如果缓存中缺少某些文件夹的系统类型,只检测这些文件夹 3. **缓存过期(超过24小时)**: 自动重新获取并更新 ### 缓存优势 - **提高效率**: 避免重复获取文件夹列表 - **减少FTP操作**: 缓存有效时不连接FTP服务器 - **智能使用**: 只在必要时才进行FTP检测 - **自动恢复**: 缓存过期自动重新获取 ## 日志文件 ### logs/upgrade_needed.log 记录所有需要升级的旧迅睿系统 **格式**: ``` [2026-01-04 15:21:23] 文件夹: xaclz.com, 系统类型: 旧迅睿系统, 需要升级 [2026-01-04 15:21:24] 文件夹: xahuameida.com, 系统类型: 旧迅睿系统, 需要升级 ... ``` **用途**: - 跟踪需要升级的系统 - 提供升级任务清单 - 支持历史记录查询 ### logs/entry_file_operations.log 记录所有入口文件操作日志 **格式**: ``` ================================================================================ [2026-01-04 17:08:21] 开始处理入口文件对比 总文件夹数: 186 ================================================================================ [2026-01-04 17:08:21] 文件夹: ylhyqc.com, 系统: new_xunrui, 操作: start, 文件: N/A, 状态: 开始对比, 详情: 共 3 个文件 [2026-01-04 17:08:21] 文件夹: ylhyqc.com, 系统: new_xunrui, 操作: skip, 文件: /index.php, 状态: 文件内容一致, 详情: 无需更新 [2026-01-04 17:08:21] 文件夹: ylhyqc.com, 系统: new_xunrui, 操作: skip, 文件: /m/index.php, 状态: 文件内容一致, 详情: 无需更新 [2026-01-04 17:08:21] 文件夹: ylhyqc.com, 系统: new_xunrui, 操作: skip, 文件: /mobile/index.php, 状态: 文件内容一致, 详情: 无需更新 [2026-01-04 17:08:21] 文件夹: xaclz.com, 系统: old_xunrui, 操作: start, 文件: N/A, 状态: 开始对比, 详情: 共 3 个文件 [2026-01-04 17:08:21] 文件夹: xaclz.com, 系统: old_xunrui, 操作: upload, 文件: /index.php, 状态: 文件内容不一致, 详情: 本地文件: php/old_xunrui/index.php [2026-01-04 17:08:21] 文件夹: xaclz.com, 系统: old_xunrui, 操作: upload, 文件: /index.php, 状态: 上传成功, 详情: 本地文件: php/old_xunrui/index.php [2026-01-04 17:08:21] 文件夹: xaclz.com, 系统: old_xunrui, 操作: skip, 文件: /m/index.php, 状态: FTP文件不存在, 详情: FTP文件不存在 ... ================================================================================ [2026-01-04 17:08:25] 入口文件处理汇总: 处理文件夹: 83 个 上传文件: 15 个 跳过文件: 234 个 错误文件: 0 个 ================================================================================ ``` **用途**: - 记录所有入口文件操作 - 追踪文件上传历史 - 问题排查和溯源 - 统计操作数据 - 审计文件变更 ### logs/index_html_deletion.log 记录所有 index.html 文件删除操作 **格式**: ``` ================================================================================ [2026-01-04 17:30:00] 开始删除 index.html 文件 总文件夹数: 186 ================================================================================ [2026-01-04 17:30:00] 文件夹: example.com, 系统: N/A, 操作: delete, 文件: /index.html, 状态: 删除成功, 详情: index.html 文件已删除 [2026-01-04 17:30:00] 文件夹: test.com, 系统: N/A, 操作: skip, 文件: /index.html, 状态: 文件不存在, 详情: index.html 文件不存在 ... ================================================================================ [2026-01-04 17:30:15] index.html 删除汇总: 处理文件夹: 186 个 删除文件: 45 个 错误文件: 0 个 ================================================================================ ``` **用途**: - 记录所有 index.html 文件删除操作 - 追踪文件删除历史 - 问题排查和溯源 - 统计删除操作数据 ## 开发指南 ### 添加新的系统类型检测 1. 在 `detect_system_type()` 函数中添加检测逻辑 2. 在 `scan_all_folders()` 函数中添加处理分支 3. 在 `print_summary()` 函数中添加输出格式 4. 更新本文档的系统类型判断规则 ### 修改缓存有效期 在 `main()` 函数中修改: ```python CACHE_MAX_AGE_HOURS = 48 # 改为48小时 ``` ### 添加新的检测特征 在 `detect_system_type()` 函数中添加: ```python has_new_feature = 'new_folder' in contents if has_new_feature: return 'new_system_type' ``` ### 错误处理 所有函数都包含异常处理: - FTP连接失败 - 文件夹访问失败 - 缓存读写失败 - 文件操作失败 ### 错误处理和重试机制 程序实现了完善的错误处理和重试机制,确保在网络不稳定的情况下也能稳定运行: #### 1. FTP连接关闭异常处理 在程序退出时,对 `ftp.quit()` 操作添加了异常处理: ```python finally: try: ftp.quit() print("\nFTP连接已关闭") except Exception as e: print(f"\n关闭FTP连接时出错: {e}") print("程序已退出") ``` 这样可以避免因远程连接不稳定导致程序崩溃。 #### 2. FTP操作重试机制 为关键的FTP操作添加了自动重试机制(最多3次重试,每次间隔1秒): **应用场景:** - 删除文件 (`ftp.delete`) - 上传文件 (`ftp.storbinary`) - 读取文件 (`ftp.retrbinary`) **重试机制示例:** ```python max_retries = 3 for attempt in range(max_retries): try: # 执行FTP操作 ftp.delete('index.html') print(" ✓ 已删除: index.html") break except Exception as e: if attempt < max_retries - 1: print(f" ⚠ 删除失败,重试中... ({attempt + 1}/{max_retries})") time.sleep(1) else: print(f" ✗ 删除失败: index.html, 错误: {e}") ``` #### 3. 改进的功能函数 以下函数都实现了重试机制: - **read_ftp_file()**: 读取FTP文件内容,失败时自动重试 - **upload_file_to_ftp()**: 上传文件到FTP,失败时自动重试 - **delete_index_html_files()**: 删除index.html文件,失败时自动重试 #### 4. 优势 - ✅ 提高程序稳定性 - ✅ 自动处理网络波动 - ✅ 避免因临时错误导致程序崩溃 - ✅ 提供详细的错误信息和重试状态 - ✅ 优雅地处理连接关闭异常 ### 性能优化建议 1. **批量操作**: 减少FTP连接次数 2. **并发检测**: 使用多线程检测多个文件夹 3. **增量更新**: 只检测新增/修改的文件夹 4. **缓存预热**: 定期更新缓存避免高峰期 ## 常见问题 ### Q: 如何强制刷新缓存? A: 删除 `folder_cache.json` 文件,程序会自动重新获取 ### Q: 如何修改FTP连接信息? A: 在 `main()` 函数中修改 `FTP_HOST`、`FTP_PORT`、`FTP_USER`、`FTP_PASSWORD` ### Q: 检测结果不准确怎么办? A: 检查系统类型判断规则,根据实际情况调整 `detect_system_type()` 函数 ### Q: 如何导出检测结果? A: 可以修改 `print_summary()` 函数,将结果保存到JSON或CSV文件 ### Q: 程序运行很慢怎么办? A: 1. 检查网络连接 2. 减少检测的文件夹数量 3. 增加缓存有效期 4. 使用多线程优化 ## 版本历史 ### v2.0.0 (2026-01-04) - 新增入口文件自动对比和覆盖功能 - 新增完整的操作日志记录系统 - 支持根据系统类型自动选择对应的入口文件模板 - 实现文件内容对比和智能上传 - 新增 entry_file_operations.log 日志文件 - 新增日志记录函数:log_entry_file_operation、log_entry_file_summary - 新增入口文件处理函数:get_entry_files_for_system、read_local_file、read_ftp_file、compare_files、upload_file_to_ftp、compare_and_upload_entry_files、process_entry_files - 优化缓存机制,支持保存系统类型信息 - 更新文档,添加新功能说明 ### v1.0.0 (2026-01-04) - 初始版本 - 实现基本的FTP连接和文件夹遍历 - 实现系统类型检测(新迅睿、旧迅睿、织梦) - 实现缓存机制 - 实现自动更新缓存功能 - 实现日志记录功能 ## 技术栈 - **Python 3.x** - **ftplib** - FTP连接 - **json** - 缓存文件处理 - **datetime** - 时间戳管理 ## 许可证 本项目仅供内部使用 ## 联系方式 如有问题或建议,请联系开发团队