package utils import ( "fmt" "log" "os" "os/exec" "path/filepath" "strings" "github.com/pkg/browser" "github.com/shirou/gopsutil/v3/disk" "golang.org/x/sys/windows/registry" ) type PathStat struct { Path string `json:"path"` Total uint64 `json:"total"` Free uint64 `json:"free"` Used uint64 `json:"used"` UsedPercent float64 `json:"usedPercent"` } func getDefaultProgram(fileExtension string) (string, error) { key, err := registry.OpenKey(registry.CLASSES_ROOT, fmt.Sprintf(`.%s`, fileExtension), registry.QUERY_VALUE) if err != nil { return "", err } defer key.Close() // 读取默认程序关联值 defaultProgram, _, err := key.GetStringValue("") if err != nil { return "", err } return defaultProgram, nil } func hasDefaultProgram(fileExtension string) bool { prog, err := getDefaultProgram(fileExtension) if err != nil { log.Println("getDefaultProgram Error:", err) return false } if prog == "" { return false } return true } func OpenFileOrExplorer(filePath string, explorer bool) error { if _, err := os.Stat(filePath); err != nil { log.Printf("%s %v\n", filePath, err) return err } canOpen := false fileExtension := "" index := strings.LastIndex(filePath, ".") if index > 0 { fileExtension = filePath[index+1:] canOpen = hasDefaultProgram(fileExtension) } if canOpen && !explorer { return browser.OpenFile(filePath) } commandArgs := []string{"/select,", filePath} fmt.Println("cmd:", "explorer", commandArgs) // 创建一个Cmd结构体表示要执行的命令 cmd := exec.Command("explorer", commandArgs...) // 执行命令并等待它完成 err := cmd.Run() if err != nil { log.Printf("Error executing command: %s\n", err) // return err } fmt.Println("Command executed successfully") return nil } func GetPathStat(path string) (PathStat, error) { pathStat := PathStat{} absPath, err := filepath.Abs(path) if err != nil { return pathStat, err } stat, err := disk.Usage(absPath) if err != nil { return pathStat, err } pathStat.Path = stat.Path pathStat.Total = stat.Total pathStat.Used = stat.Used pathStat.Free = stat.Free pathStat.UsedPercent = stat.UsedPercent return pathStat, nil } func PathIsCanWriteFile(path string) bool { filepath := fmt.Sprintf("%s\\CanWrite.txt", path) file, err := os.OpenFile(filepath, os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return false } file.Close() os.Remove(filepath) return true }