# ctyun-oos **Repository Path**: fangaiming1/ctyun-oos ## Basic Information - **Project Name**: ctyun-oos - **Description**: ctyun-oos,通用 S3 对象存储客户端 一个界面管理所有 S3 兼容对象存储。 天翼云、阿里云、腾讯云、七牛云、华为云……自动适配,即连即用。 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2026-06-07 - **Last Updated**: 2026-06-20 ## Categories & Tags **Categories**: distributed-storage **Tags**: None ## README # 🗄️ 通用 S3 对象存储客户端 v1.9.9 **一个界面管理所有 S3 兼容对象存储。** 天翼云、阿里云、腾讯云、七牛云、华为云……自动适配,即连即用。 ![.NET Framework 4.8](https://img.shields.io/badge/.NET-4.8-blue) ![WinForms](https://img.shields.io/badge/UI-WinForms-green) ![License](https://img.shields.io/badge/license-MIT-yellow) --- ## ✨ 为什么选这个工具 | 对比 | 官方控制台 | rclone/s3cmd | **本工具** | |------|:---:|:---:|:---:| | 图形界面 | ✅ | ❌ 命令行 | ✅ WinForms | | 多厂商统一管理 | ❌ 各用各的 | ✅ | ✅ | | 自动适配签名/寻址 | ❌ | 需手动配 | ✅ 15策略全自动 | | 断点续传 | 部分 | ✅ | ✅ | | 批量下载+暂停 | 部分 | ✅ | ✅ 可视进度 | | 全中文 | 国内厂商有 | ❌ | ✅ | | 免费 | ✅ | ✅ | ✅ 开源 | --- ## 🧠 核心:15 策略自动探测引擎 不同厂商的 S3 兼容实现各有差异,本工具**每种操作自动尝试最多 15 种策略**,首次成功即缓存,后续零开销。 ``` ✅ SDK + PathStyle (AWS SDK SigV4, 路径风格 URL) ✅ SDK + VirtualHostedStyle (AWS SDK SigV4, 虚拟托管 URL) ✅ SigV4 + PathStyle (原生 HMAC-SHA256, 路径风格) ✅ SigV4 + VirtualHostedStyle (原生 HMAC-SHA256, 虚拟托管) ✅ BCE + PathStyle (bce-auth-v1 备用, 路径风格) ✅ BCE + VirtualHostedStyle (bce-auth-v1 备用, 虚拟托管) ✅ SigV2 + PathStyle (HMAC-SHA1, 路径风格) ✅ SigV2 + VirtualHostedStyle (HMAC-SHA1, 虚拟托管) ✅ SigV2 + VHost + Bucket签名 (HMAC-SHA1 含 bucket——阿里云专用) ✅ SigV2 + S3EscapeKey + Path (中文key兼容, 路径风格) ✅ SigV2 + S3EscapeKey + VHost (中文key兼容, 虚拟托管) ✅ SigV4 + S3EscapeKey + Path (中文key兼容, 路径风格) ✅ SigV4 + S3EscapeKey + VHost (中文key兼容, 虚拟托管) ✅ BCE + S3EscapeKey + Path (中文key兼容, 路径风格) ✅ BCE + S3EscapeKey + VHost (中文key兼容, 虚拟托管) ``` **每个操作独立缓存**最优策略,登录/浏览/上传/下载/删除各走各的最优路径。 **中文key自动跳过SDK**,走 S3EscapeKey 原生HTTP路径,解决中文括号等特殊字符签名不匹配问题。 --- ## 🚀 快速开始 ### 运行 1. `Ctyun-oos.sln` 用 VS2019+ 或 Rider 打开 2. 还原 NuGet → 编译 → F5 运行 3. 或者直接运行 `bin\Debug\Ctyun_oos.exe` ### 运行单元测试 ```bash # 命令行(在项目根目录执行) dotnet test Ctyun-oos.Tests/Ctyun-oos.Tests.csproj # 或在 Visual Studio 中 # 测试 → 测试资源管理器 → 运行所有测试 ``` > 测试项目:`Ctyun-oos.Tests/`,.NET Framework 4.8 + MSTest,16 个用例覆盖核心引擎、账户管理、XML 解析。 ### 3 步上手 1. **添加账户** — 输入 AccessKey / SecretKey / Endpoint 2. **点击连接** — 自动拉取桶列表并选中 3. **操作文件** — 浏览、上传、下载、删除 ### 常用 Endpoint | 存储商 | Endpoint | |--------|----------| | 天翼云 OOS | `oos-cn.ctyunapi.cn` | | 阿里云 OSS | `oss-cn-{region}.aliyuncs.com` | | 腾讯云 COS | `cos.{region}.myqcloud.com` | | 七牛云 Kodo | `s3.cn-east-1.qiniucs.com` | | 华为云 OBS | `obs.{region}.myhuaweicloud.com` | | 百度云 BOS | `s3.{region}.bcebos.com`(注意不是 bcebos.com) | | 其他 S3 兼容 | 填域名即可,程序自动拼接 https:// | --- ## 📋 全部功能 ### 账户管理 - 增删改 S3 兼容账户 - DisplayName / Endpoint / AK / SK / SSL / Region - JSON 本地持久化 ### 浏览 - 分页列表(每页 1000 项,千万级无压力) - 翻页导航 / 返回上级目录 - 双击文件夹进入 / 双击文件下载 - 路径面包屑显示 ### 上传 - 单文件 / 文件夹上传(保持目录结构) - 拖拽上传 - 独立进度窗口 - 5 策略自动探测 ### 下载 - 单文件下载(右键 / 双击弹框选位) - 文件夹递归下载 - 批量多桶并发下载(可调 1~64 线程) - 暂停 / 继续 - 断点续传(自动比对云端大小,已下载跳过) - 失败/跳过记录自动落盘 ### 删除 - 单文件 / 文件夹删除 - 递归扫描后删除 - 文件/文件夹误选互斥提示 - 独立进度窗口 ### 其他 - 文件预览(下载到临时目录 → 系统程序打开) - 新建文件夹 - 全中文界面 - 操作日志 + 更新日志双标签页 - SSL 自签名证书兼容 --- ## 🔧 技术栈 | 技术 | 版本 | |------|------| | .NET Framework | 4.8 | | UI | WinForms | | AWS SDK | AWSSDK.S3 4.0.24 / AWSSDK.Core 4.0.7.5 | | JSON | System.Text.Json 8.0.6 | | 语言 | C# | --- ## 📁 项目结构 ``` Ctyun-oos/ ├── Forms/ │ ├── AccountForm.cs 账户编辑对话框 │ ├── UploadForm.cs 上传进度窗口 │ ├── DeleteForm.cs 删除进度窗口 │ └── BatchDownloadForm.cs 批量下载窗口 ├── Helpers/ │ ├── S3ClientHelper.cs 核心:15策略探测 + 缓存引擎 │ └── S3ErrorMessage.cs 统一错误翻译器 ├── Managers/ │ └── AccountManager.cs 账户 JSON 持久化 ├── Models/ │ └── S3Account.cs 数据模型 ├── MainForm.cs 主窗口 ├── Program.cs 入口 └── README.md ``` --- ## 🔐 安全说明 - 凭据存储在 `%APPDATA%\CtyunOOS\accounts.json`(明文 JSON) - 开源版本未做加密,有安全需求可自行加 `ProtectedData` - SSL 证书验证默认全局信任(兼容自签名证书的私有部署) --- ## 📝 更新日志 ### v1.9.9 (2026-06-20) - **修复:** 切换账户时 `SemaphoreSlim` 已释放导致崩溃(`_disposed` 生命周期保护) - **修复:** 并发竞态下 `NotProbed` 缓存值传入 `ExecuteMethod` 导致参数异常 - **修复:** 分页边界——`IsTruncated=true` 但无 `NextMarker` 时 SigV2/SigV4/BCE 丢失后续数据 - **修复:** 中文特殊字符(括号/书名号等)上传下载签名不匹配——`S3EscapeKey` 智能编码 - **修复:** 批量下载 HEAD 断点续传检查兼容 15 策略 - **修复:** 中文 key 批量下载异常逃逸——改为入口清除 SDK 缓存强制走原生 HTTP 路径 - **新增:** 15 策略探测引擎(原 9 + 新增 6 个 S3EscapeKey 变体)——AWS + 国内厂商全兼容 - **新增:** `S3ErrorMessage` 统一错误翻译器——13 种错误码友好中文提示 + error.log 路径 - **新增:** `GetServiceUrl` 尊重用户显式填写的 http/https 协议 - **新增:** AccountForm 端点 + SSL 复选框提示文案 - **新增:** MainForm 最大化按钮隐藏 - **新增:** 账户按钮文案:添加账号/编辑账号/删除账号/连接账号 - **重构:** 错误翻译逻辑从 `S3ClientHelper` 拆分为独立 `S3ErrorMessage` 类 ### v1.9.8 (2026-06-10) - **核心:** 全部耗时统计突破 24 小时限制——1588 小时不再归零 - **核心:** FmtDuration 统一格式化——批量/单文件操作全部准确 ### v1.9.7 (2026-06-10) - **核心:** Windows 大小写冲突检测——郭楠欣.JPG/郭楠欣.jpg 自动加后缀 - **核心:** 重复文件检测覆盖全链路 + 工具栏多文件下载并发化 ### v1.9.6 (2026-06-10) - **核心:** 下载后文件大小校验 + 写入前磁盘空间检测 - **核心:** 桶名统一小写 + 端点双协议自动剥离 - **核心:** 全部批量操作/单文件实时耗时显示 - **改进:** 账户保存失败提示目录权限 ### v1.9.5 (2026-06-10) - **核心:** 全部批量操作统一 Stopwatch 计时 + 跨账户桶名隔离 - **核心:** 自适应分片上传 TB 级支持 + 超大文件友好提示 - **新增:** 桶不存在/信号量/签名/端点错误友好中文提示 - **修复:** error.log 全链路覆盖 + 大文件进度溢出 ### v1.9.4 (2026-06-10) - **核心:** 9策略全自动探测引擎 — SDK×2+SigV4×2+BCE×2+SigV2×3 - **新增:** 百度云 S3 兼容支持(s3.gz.bcebos.com,SigV2 直通) - **新增:** SigV4+BCE 双备用认证策略(通用兜底) - **修复:** 异常堆栈完整写入、分片上传闭包越界、error.log全覆盖 ### v1.9.3 (2026-06-07) - **新增:** 全局异常捕获→error.log + ListObjects V2降级 - **修复:** _pauseEvent、线程配置UI、_loadCts等4项 ### v1.9.0 (2026-06-07) - **核心:** 所有批量操作统一多线程并发(SemaphoreSlim) - **核心:** 统一线程配置:MainForm批量操作线程数(1-64) - **核心:** 分片上传(Multipart Upload)— >5MB自动分片5MB×4并发 - **核心:** 批量删除API — SDK模式一次删1000个key,不兼容自动降级单删 - **核心:** 子窗口退出信号 — Done.Wait代替Thread.Sleep盲等 - **新增:** DownloadFiles支持取消 - **修复:** 文件夹上传路径、SigV2签名、CTS泄漏、端口耗尽、OOM等 ### v1.8.0 (2026-06-07) - **核心:** 断点续传双层策略(HEAD精确校验 → 本地大小比对降级),HEAD不可用时不再放弃断点续传 - **核心:** SDK双客户端架构(PathStyle/VHostStyle独立实例),修复长时间下载崩溃 - **核心:** 原子下载(临时文件→File.Move替换),避免下载失败导致旧文件被删 - **新增:** 连接守卫 — 切换账户时检测活跃批量操作(含文件夹下载),弹窗确认后终止 - **新增:** 通知栏 — 连接按钮右侧实时显示批量操作状态 - **新增:** 单元测试项目 — 16个用例覆盖核心引擎/账户管理/XML解析 - **新增:** 瞬态网络容错 — 首次失败200ms后重试,过滤偶发波动 - **改进:** Failed缓存仅对HEAD生效,下载/上传不缓存失败,避免一个文件失败毒化全部 - **修复:** 批量下载挂机过夜后 `AmazonS3Client` 被Dispose导致全线程崩溃 - **修复:** 批量操作进行中切换账户导致 `AmazonS3Client` 被Dispose崩溃 - **修复:** 批量下载窗口关闭时控件已释放导致 `FlushUI` 崩溃 ### v1.7.0 (2026-06-06) - **核心:** 5 策略全自动探测引擎,覆盖所有 S3 兼容变体 - **核心:** 每种操作独立缓存最优策略 - **新增:** 读取操作 SigV2 原生回退 + XML 解析 - **新增:** SigV2 签名变体适配(阿里云专用) - **新增:** SSL 自签名证书绕过 - **修复:** VHost URL 非标端口丢失 - **改进:** 切换账户自动清空预览列表 - **改进:** 全部失败时输出每种策略的失败原因 - **修复:** 多项并发安全和资源泄漏修复
更早版本 ### v1.6.0 - 上传/删除独立进度窗口 - 上传/删除双模(SDK→SigV2 回退) - 工具栏分隔符分组 ### v1.5.0 - API 统一 V1(ListObjectsRequest) - 断点续传 ### v1.4.0 - 批量下载全选/反选 - 暂停/继续下载 ### v1.3.0 - ListObjects V1 分页 - 上一页/下一页翻页 ### v1.0.0 ~ v1.2.0 - 基础 S3 兼容客户端 - 多桶浏览、文件上传下载删除 - 批量下载、文件夹递归
--- ## 👤 作者 **欧阳文华** — 郴州电信政支工程师 --- ## 📄 许可证 MIT License — 自由使用、修改、分发。