Windows 多标签页文件管理器(Wails v2 + Go + 原生 JS),可接管资源管理器:原生右键菜单、回收站、发送到、外壳扩展。
wails dev # 开发(前端热重载)
wails build # 生产构建 → build/bin/filemanager.exe
go test ./... # 后端测试
npm test --prefix frontend # 前端 VitestGo 1.25 + Wails v2.13 + Vite 7 + 原生 JS(无框架,frontend/src/main.js 单文件);Win32/COM 直接调用(go-ole、syscall shell32)。
- 根目录 Go 文件全部
package main,App 方法即前端 RPC;新增功能先看app.go/ops.go的模式。 shellmenu.go/shellenum.go是 COM vtable 手写调用,易碎——改动后跑go test ./...和前端 menu 测试。- 目录枚举走
shellenum.go的listDirEntries:OneDrive 等云占位目录(reparse point)必须用IShellFolder::EnumObjects,绝不能用os.ReadDir/FindFirstFile枚举它们(会触发 OneDrive 下载目录全部内容)。 - 枚举目标目录前必须
SHBindToParent后BindToObject:直接枚举SHBindToParent返回的父 folder 会枚举到父/桌面内容;OneDrive 路径在 shell 里是虚拟命名空间,不经BindToObject会枚举到桌面。 SHBindToParent输出的 childPidl 是 absPidl 内部的借用指针,不可单独释放;os.Lstat拿不到 OneDrive 的 REPARSE 位(被 cldflt 隐藏),检测用FindFirstFile(见isReparseDir)。- 前端业务状态都在
main.js(标签页/选中/视图);改 UI 优先复用showError等既有工具。 third_party/systray是本地补丁版,go.mod有replace,不要直接升级该依赖。frontend/wailsjs/由 Wails 生成,勿手改;改 Go RPC 签名后跑wails generate module(它只增量合并,已存在方法的新签名需手改App.d.ts)。- 构建产物
filemanager.exe、frontend/dist、.reasonix/不入库(已在 .gitignore)。
活跃开发中;工作区有未提交变更(回收站删除、多选右键 shell 菜单、OneDrive 枚举、autostart.go 等)。注意 data/settings.json 是运行态设置,是否入库待定。