package filesystem import ( "fmt" "os/exec" "path/filepath" "runtime" "time" ) // ========== 向后兼容的全局函数包装器 ========== // 这些函数提供向后兼容性,内部委托给 FileSystemService // 新代码应该使用 FileSystemService 而不是这些全局函数 // ReadFile 读取文件内容(向后兼容包装器) func ReadFile(path string) (string, error) { service, err := GetGlobalService() if err != nil { return "", fmt.Errorf("服务未初始化: %v", err) } return service.ReadFile(path) } // WriteFile 写入文件(向后兼容包装器) func WriteFile(path, content string) error { service, err := GetGlobalService() if err != nil { return fmt.Errorf("服务未初始化: %v", err) } return service.WriteFile(path, content) } // ListDir 列出目录内容(向后兼容包装器) func ListDir(path string) ([]map[string]interface{}, error) { service, err := GetGlobalService() if err != nil { return nil, fmt.Errorf("服务未初始化: %v", err) } return service.ListDir(path) } // CreateDir 创建目录(向后兼容包装器) func CreateDir(path string) error { service, err := GetGlobalService() if err != nil { return fmt.Errorf("服务未初始化: %v", err) } return service.CreateDir(path) } // CreateFile 创建空文件(向后兼容包装器) func CreateFile(path string) error { service, err := GetGlobalService() if err != nil { return fmt.Errorf("服务未初始化: %v", err) } return service.CreateFile(path) } // DeletePath 删除文件或目录(向后兼容包装器) func DeletePath(path string) error { service, err := GetGlobalService() if err != nil { return fmt.Errorf("服务未初始化: %v", err) } return service.DeletePath(path) } // DeletePathWithConfig 使用指定配置删除文件或目录(向后兼容包装器) func DeletePathWithConfig(path string, config *Config) error { service, err := GetGlobalService() if err != nil { return fmt.Errorf("服务未初始化: %v", err) } // 临时替换服务的配置 originalConfig := service.config service.config = config defer func() { service.config = originalConfig }() return service.DeletePath(path) } // GetFileInfo 获取文件信息(向后兼容包装器) func GetFileInfo(path string) (map[string]interface{}, error) { service, err := GetGlobalService() if err != nil { return nil, fmt.Errorf("服务未初始化: %v", err) } return service.GetFileInfo(path) } // 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) } // 给进程一点时间启动 go func() { time.Sleep(100 * time.Millisecond) cmd.Process.Release() }() return nil } // RenamePath 重命名文件或目录(向后兼容包装器) func RenamePath(oldPath, newPath string) error { service, err := GetGlobalService() if err != nil { return fmt.Errorf("服务未初始化: %v", err) } return service.RenamePath(oldPath, newPath) } // ========== 辅助函数 ========== // formatBytes 格式化字节大小为人类可读格式 func formatBytes(bytes int64) string { const unit = 1024 if bytes < unit { return fmt.Sprintf("%d B", bytes) } div, exp := int64(unit), 0 for n := bytes / unit; n >= unit; n /= unit { div *= unit exp++ } return fmt.Sprintf("%.2f %cB", float64(bytes)/float64(div), "KMGTPE"[exp]) }