-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquickaccess.go
More file actions
120 lines (111 loc) · 3.28 KB
/
Copy pathquickaccess.go
File metadata and controls
120 lines (111 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
"unsafe"
"golang.org/x/sys/windows"
)
var (
ole32 = windows.NewLazySystemDLL("ole32.dll")
procCoTaskMemFree = ole32.NewProc("CoTaskMemFree")
procSHGetKnownFolderPath = shell32.NewProc("SHGetKnownFolderPath")
)
// QuickItem 快速访问条目
type QuickItem struct {
Name string `json:"name"`
Path string `json:"path"`
IsCustom bool `json:"isCustom"`
}
// 常用 KnownFolder GUID(FOLDERID_*)
var knownFolders = []struct {
name string
guid string
}{
{"桌面", "B4BFCC3A-DB2C-424C-B029-7FE99A87C641"},
{"下载", "374DE290-123F-4565-9164-39C4925E467B"},
{"文档", "FDD39AD0-238F-46AF-ADB4-6C85480369C7"},
{"图片", "33E28130-4E1E-4676-835A-98395C3BC3BB"},
{"音乐", "4BD8D571-6D19-48D3-BE97-422220080E43"},
{"视频", "18989B1D-99B5-455B-841C-AB7C74E4DDFC"},
}
// knownFolderPath 查询系统已知文件夹路径(如桌面、下载)
func knownFolderPath(guid string) (string, error) {
// GUIDFromString(CLSIDFromString) 要求 {XXXXXXXX-...} 花括号格式
if !strings.HasPrefix(guid, "{") {
guid = "{" + guid + "}"
}
g, err := windows.GUIDFromString(guid)
if err != nil {
return "", fmt.Errorf("GUID 无效:%v", err)
}
var p *uint16
r, _, _ := procSHGetKnownFolderPath.Call(
uintptr(unsafe.Pointer(&g)),
0, // dwFlags = KF_FLAG_DEFAULT
0, // hToken
uintptr(unsafe.Pointer(&p)))
if r != 0 {
return "", fmt.Errorf("获取已知文件夹失败(错误码 %d)", uint32(r))
}
defer procCoTaskMemFree.Call(uintptr(unsafe.Pointer(p)))
return windows.UTF16PtrToString(p), nil
}
// GetQuickAccess 返回快速访问列表:系统已知文件夹 + 用户自定义
func (a *App) GetQuickAccess() ([]QuickItem, error) {
items := make([]QuickItem, 0, len(knownFolders))
for _, kf := range knownFolders {
path, err := knownFolderPath(kf.guid)
if err != nil {
continue // 某些文件夹可能不存在(如未配置 OneDrive 时)
}
items = append(items, QuickItem{Name: kf.name, Path: path})
}
// 合并自定义快速访问
if s, err := LoadSettings(); err == nil {
items = append(items, s.CustomQuickAccess...)
}
return items, nil
}
// AddQuickAccess 把文件夹固定到自定义快速访问
func (a *App) AddQuickAccess(path string) error {
info, err := os.Stat(path)
if err != nil {
return fmt.Errorf("无法固定 %s:%s", path, osErrText(err))
}
if !info.IsDir() {
return fmt.Errorf("只能固定文件夹到快速访问")
}
s, err := LoadSettings()
if err != nil {
return err
}
name := strings.TrimRight(path, `\`)
name = filepath.Base(name)
for _, q := range s.CustomQuickAccess {
if strings.EqualFold(q.Path, path) {
return nil // 已存在
}
}
s.CustomQuickAccess = append(s.CustomQuickAccess, QuickItem{Name: name, Path: path, IsCustom: true})
return s.Save()
}
// RemoveQuickAccess 从自定义快速访问移除
func (a *App) RemoveQuickAccess(path string) error {
s, err := LoadSettings()
if err != nil {
return err
}
filtered := s.CustomQuickAccess[:0]
for _, q := range s.CustomQuickAccess {
if !strings.EqualFold(q.Path, path) {
filtered = append(filtered, q)
}
}
if len(filtered) == len(s.CustomQuickAccess) {
return fmt.Errorf("该目录不在快速访问中")
}
s.CustomQuickAccess = filtered
return s.Save()
}