简体中文 | English
Flow 是一个面向 网盘映射目录 <-> 本地媒体目录 场景的模块化同步工具,由 Zeayii 工程体系维护。
它的设计目标不是替代本地磁盘内的 copy/move,而是为“文件路径表面上是本地目录,底层语义实际上是上传/下载”的场景提供稳定、可恢复、可观测的同步能力。
很多家庭媒体或服务器场景会采用下面的链路:
- 云盘或网盘通过挂载工具映射到本地路径。
- Jellyfin / Emby / Plex 等媒体服务把这个映射路径当作媒体库目录。
- 用户希望在“本地整理目录”和“映射目录”之间做批量同步。
表面上看这是文件复制,实际上却不是传统的本地磁盘复制:
- 从本地写入映射目录,本质上往往是“上传”。
- 从映射目录读回本地,本质上往往是“下载”。
- 文件操作耗时长、易中断、可能出现部分产物。
- 同步过程需要进度、速度、日志和失败恢复。
因此 Flow 选择了:
- 基于异步文件流的复制模型
- 基于临时产物的断点续传模型
- 基于 TUI Dashboard 的运行时观测模型
- 基于策略的冲突处理与失败处理模型
- 基于
Global -> Task -> File的单向取消模型 - 基于“业务顺序执行 + UI线程/日志线程隔离”的线程模型
- 为网盘映射目录场景提供更接近“传输系统”而不是“文件管理器”的执行语义。
- 对单文件和目录任务统一抽象,支持可恢复、可中断、可重试的同步。
- 保持架构语义清晰:
CommandLine负责宿主,Core负责执行,Presentation负责呈现。 - 保持发布可用:支持 NativeAOT 单文件发布。
Zeayii.Flow.CommandLine:命令行宿主、参数绑定、本地化与 dry-run。Zeayii.Flow.Core:同步引擎、任务运行时、异步流复制、策略与上下文。Zeayii.Flow.Presentation:Spectre.Console 终端 Dashboard。Zeayii.Flow.Tests:排序、文本渲染、日志缓冲、配置映射等测试。
sequenceDiagram
participant User as User
participant CLI as CommandLine
participant OPTS as OptionsBuilder
participant ENG as TaskTransferEngine
participant RUN as TaskRuntime
participant CAP as FileTransferCapability
participant UI as Presentation
User->>CLI: run flow with plan
CLI->>OPTS: parse cli and build app options
OPTS->>ENG: build core options and task requests
CLI->>UI: start dashboard
ENG->>RUN: run tasks sequentially
RUN->>CAP: stream copy / resume / finalize
CAP-->>RUN: file outcome
RUN->>UI: task progress + file progress + logs
RUN-->>ENG: task result
ENG-->>CLI: final exit code
CLI-->>User: final dashboard / console output
在传统磁盘之间,File.Copy 很直接。
但对“映射目录 = 上传/下载代理层”的场景,它有几个问题:
- 难以表达异步传输过程。
- 难以暴露稳定的实时进度与速度。
- 难以做精细的断点续传。
- 难以把
.tmp产物、失败重试和状态机串起来。
因此 Flow 的核心传输路径使用异步流式 IO,而不是把同步语义外包给一次性系统调用。
Flow 采用临时产物文件驱动恢复:
- 正在写入时先写
.tmp - 若任务中断,后续可根据
.tmp长度决定是否续传 - 若最终目标已完整存在,在
Resume策略下直接视为Skipped - 复制完成后再做最终落盘
ConflictPolicyResumeOverwriteRename
TaskFailurePolicyContinueStopCurrentTaskStopAll
注意:
Skipped是执行结果,不是冲突策略。Resume包含“无需恢复则直接跳过”这一边界语义。
Flow 将“取消控制”和“执行结果”分开:
CancellationTokenSource负责停止执行Completed / Skipped / Failed / Canceled负责表达结果- 失败策略只决定是否把文件失败升级成更大范围的取消
当前取消层级为:
- 全局运行取消
- 顶层任务取消
- 单文件取消
传播原则:
- 取消只从上层向下层传播
- 单文件不能反向取消任务
- 文件失败默认只是文件失败
StopCurrentTask才会取消当前任务StopAll才会取消整个程序内的全部任务
Flow 的主界面采用三列布局:
- 左列:任务详细列表
- 中列:状态分布与任务名称网格
- 右列:日志输出
顶部标题栏分为两部分:
- 左侧:关键运行参数
- 右侧:实时摘要(数量 / 速率)
底部保留快捷键说明,详情页支持单独滚动查看目录下所有文件。
- .NET SDK 10.0+
- Windows / Linux / macOS 受支持运行时
- 若涉及网盘挂载,请先确保挂载层自身可稳定读写
- 若要使用 NativeAOT 单文件,请使用固定 RID 发布
dotnet build Zeayii.Flow.sln -v minimaldotnet test Zeayii.Flow.sln -v minimaldotnet run --project Zeayii.Flow.CommandLine -- plan.jsondotnet run --project Zeayii.Flow.CommandLine -- plan.json --dry-rundotnet publish Zeayii.Flow.CommandLine/Zeayii.Flow.CommandLine.csproj -c Release -r win-x64 -p:PublishAot=true -p:PublishSingleFile=true -o .artifacts/publish/win-x64-aot- 架构规范:ARCHITECTURE.md
- 工程排障:TROUBLESHOOTING.md
- CommandLine:README.md
- Core:README.md
- Presentation:README.md
- Tests:README.md
dotnet build Zeayii.Flow.sln -v minimal通过dotnet test Zeayii.Flow.sln -v minimal通过--dry-run与真实执行路径烟测通过Resume / Overwrite / Rename语义符合预期- Dashboard 布局、滚动、详情页可用
- 本地化资源和帮助文本已同步更新
- AOT 单文件产物已验证