-
Notifications
You must be signed in to change notification settings - Fork 1
/
embed.go
56 lines (48 loc) · 1.03 KB
/
embed.go
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
package filer
import (
"embed"
"io/fs"
"os"
"path/filepath"
)
// 释放 embed.FS
func ReleaseEmbedFS(efs embed.FS, root string, args ...string) (string, error) {
pattern := "efs-*"
if len(args) > 0 {
pattern = args[0]
}
// 创建临时目录
tempDir, err := os.MkdirTemp("", pattern)
if err != nil {
return "", err
}
// 递归复制目录内容
err = fs.WalkDir(efs, root, func(p string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
// 计算目标路径
relPath, err := filepath.Rel(root, p)
if err != nil {
return err
}
targetPath := filepath.Join(tempDir, relPath)
// 如果是目录,则创建目录
if d.IsDir() {
return os.MkdirAll(targetPath, 0755)
}
// 如果是文件,则复制文件内容
data, err := fs.ReadFile(efs, p)
if err != nil {
return err
}
return os.WriteFile(targetPath, data, d.Type().Perm())
})
// 出错时清理临时目录
if err != nil {
os.RemoveAll(tempDir)
return "", err
}
// 返回临时目录的路径
return tempDir, nil
}