Private
Public Access
1
0
Files
u-desk/internal/filesystem/fs.go
绝尘 b849e6cc46 新增:应用配置管理模块,优化文件系统功能
- 新增 ConfigAPI 和 ConfigService 实现配置管理
- 新增 SettingsPanel 和 UpdateNotification 组件
- 文件系统模块化重构,提升代码质量
- 提取公共函数,优化代码结构
- 版本号更新至 0.2.0
2026-01-28 23:38:23 +08:00

159 lines
4.2 KiB
Go

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])
}