基于 Wails v2 的 Windows 多标签页文件管理器。目标形态:可接管资源管理器的原生文件管理器(右键菜单、回收站、发送到、外壳扩展全部走 Win32/COM 原生接口)。
- 后端:Go 1.25 + Wails v2(v2.13.0),
package main单包 - 前端:Vite 7 + 原生 JavaScript(无框架,单文件
frontend/src/main.js),测试用 Vitest + jsdom - 原生集成:Win32 API 直接调用——
go-ole走 COM vtable 取 Shell 上下文菜单(shellmenu.go)、SHFileOperationW删除到回收站、ShellExecuteExW打开/属性、CF_HDROP 剪贴板(clipboard.go) - 托盘:本地补丁版
getlantern/systray(third_party/systray,go.mod中replace,新增左键点击SetOnClick回调)
前置:Go ≥ 1.25、Node ≥ 22、Wails CLI(go install github.com/wailsapp/wails/v2/cmd/wails@latest)。
wails dev # 开发模式(热重载)
wails build # 生产构建,输出 build/bin/filemanager.exe测试:
go test ./... # 后端
npm test --prefix frontend # 前端 Vitest├── main.go 入口:单实例、启动参数、wails.Run
├── app.go 核心:目录列表(ListDirectory)、驱动器、启动/唤醒逻辑
├── ops.go 文件操作:新建/删除/重命名/打开/属性/剪贴板/发送到
├── settings.go 设置持久化(JSON → data/settings.json)
├── shellmenu.go Shell 上下文菜单(COM:IShellFolder/IContextMenu、外壳扩展,支持多选)
├── shellenum.go 目录枚举(IShellFolder::EnumObjects;云占位目录不触发 OneDrive 下载)
├── clipboard.go CF_HDROP 文件剪贴板
├── system.go / systemicon.go / tray.go 系统集成、图标、托盘
├── autostart.go 开机自启动
├── quickaccess.go / shelllink.go 快速访问、.lnk 解析
├── frontend/ Vite + 原生 JS;wailsjs/ 为生成的 Go 绑定
└── third_party/systray 本地补丁版 systray(replace 引用,勿直接升级)
- 单实例:已有实例运行时,外部(资源管理器
%V等)传入的路径写入临时文件,旧实例轮询发现后发open-path事件跳转。 - 薄后端、厚前端:Go 层是对文件系统/Shell 能力的薄封装;标签页、选中、视图状态等业务状态都在前端
main.js。 - Shell 菜单:
GetShellContextMenu通过 COM vtable 直接调IContextMenu::QueryContextMenu/InvokeCommand,把资源管理器原生菜单搬进应用,并可混入自定义命令与注册表外壳扩展;支持多选路径(全部选中项一并传入GetUIObjectOf,第三方扩展按多选语义显示)。 - 云盘目录枚举:OneDrive 等云占位目录(reparse point)枚举走
IShellFolder::EnumObjects(shellenum.go)——FindFirstFile(os.ReadDir)枚举会触发 OneDrive 下载目录全部内容,shell API 枚举只读元数据不触发;普通目录仍走os.ReadDir。
活跃开发中。最近方向:删除改为移动回收站(SHFileOperationW)、多选右键菜单(含 shell 扩展与压缩)、OneDrive 云盘目录不触发下载(shell 枚举)、7-Zip 等 modern(IExplorerCommand)扩展支持、开机自启动(autostart.go)。工作区存在一批未提交变更(见 git status)。






