粘贴图根修(Ctrl+V直读系统剪贴板,不再依赖不可靠的paste事件)/SFTP串台双刀(拨号期禁回退本机+盘符路径自动回根)/PDF导出目录设置与文案带落盘路径/性能批(连接保存下载防重/md渲染防抖+预热/hljs按需加载/审计锁外置/快捷方式解析超时/webview-watch可停)/前端62类型错清零(含keyPath蛇形字段炸弹)/目录图标字段错位修复
55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package filesystem
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"runtime"
|
|
"time"
|
|
|
|
"u-desk/internal/common"
|
|
)
|
|
|
|
// ========== 辅助函数 ==========
|
|
|
|
// OpenPath 打开文件或目录(使用系统默认程序)
|
|
func OpenPath(path string) error {
|
|
// 使用 path.validator 进行验证
|
|
validator := NewPathValidator(DefaultConfig())
|
|
if err := validator.Validate(path); err != nil && err.IsError {
|
|
return fmt.Errorf("路径不安全: %w", err)
|
|
}
|
|
|
|
path = filepath.Clean(path)
|
|
|
|
var cmd *exec.Cmd
|
|
|
|
switch runtime.GOOS {
|
|
case "windows":
|
|
// Windows: 使用 rundll32 打开文件(更可靠)
|
|
// 这种方式比 cmd start 更稳定,支持所有文件类型
|
|
cmd = exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", path)
|
|
case "darwin":
|
|
// macOS: 使用 open 命令
|
|
cmd = exec.Command("open", path)
|
|
case "linux":
|
|
// Linux: 使用 xdg-open 命令
|
|
cmd = exec.Command("xdg-open", path)
|
|
default:
|
|
return fmt.Errorf("不支持的操作系统")
|
|
}
|
|
|
|
// 启动命令(不等待完成)
|
|
if err := cmd.Start(); err != nil {
|
|
return fmt.Errorf("打开文件失败: %v", err)
|
|
}
|
|
|
|
// 给进程一点时间启动
|
|
common.Go("fs-process-release", func() {
|
|
time.Sleep(100 * time.Millisecond)
|
|
cmd.Process.Release()
|
|
})
|
|
|
|
return nil
|
|
}
|