-
Notifications
You must be signed in to change notification settings - Fork 1
/
loader.go
106 lines (85 loc) · 2.46 KB
/
loader.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
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
package resource
import (
"bufio"
"fyne.io/fyne/v2"
"github.com/Ericwyn/EzeTranslate/log"
"io"
"os"
"path/filepath"
"strings"
)
var resourceBuf = make(map[string]*fyne.StaticResource)
var runnerPath = ""
// GetRunnerPath
// 获取程序运行路径, 这个主要是为了获取程序配置, config.yaml 以及 static 文件路径
// 这里应该拆分为两个方法
func GetRunnerPath() string {
if runnerPath == "" {
// 如果 /opt/EzeTranslate/config.yaml 存在的话, 优先使用 /opt/EzeTranslate/ 作为 runPath
if _, err := os.Stat("/opt/EzeTranslate/res-static"); err == nil {
runnerPath = "/opt/EzeTranslate/"
log.D("[opt] 程序运行目录:" + runnerPath)
return runnerPath
}
//返回绝对路径 filepath.Dir(os.Args[0])去除最后一个元素的路径
log.D("os.Args[0]:" + os.Args[0])
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
log.E("无法获取程序运行目录")
log.E(err)
}
//将\替换成/
runnerPath = strings.Replace(dir, "\\", "/", -1)
log.D("程序运行目录:" + runnerPath)
// 如果运行的目录是在 Temp 下面的话, 那么看看 ./ 目录是什么
if strings.Contains(runnerPath, "AppData/Local/Temp") ||
strings.HasPrefix(runnerPath, "/tmp") {
log.D("程序运行在 Temp 目录")
dir, err := filepath.Abs(filepath.Dir("./"))
if err != nil {
log.E("获取 ./ 目录绝对路径失败")
log.E(err)
}
runnerPath = strings.Replace(dir, "\\", "/", -1)
log.D("程序运行目录更新为: " + runnerPath)
}
}
return runnerPath
}
func GetResource(resourcePath string) *fyne.StaticResource {
if resourceBuf[resourcePath] != nil {
//log.D("load resource :" + resourcePath + " from buf map")
return resourceBuf[resourcePath]
}
finalByte := make([]byte, 0)
fi, err := os.Open(resourcePath)
if err != nil {
//fmt.Println("read file Error")
//fmt.Println(err.Error())
//return
panic(err)
}
defer fi.Close()
r := bufio.NewReader(fi)
readBuf := make([]byte, 1024)
for {
n, err := r.Read(readBuf)
if err != nil && err != io.EOF {
panic(err)
//return
}
if 0 == n {
break
} else {
// 将读取到的数据交给 callback 处理
//readFileCb(string(readBuf[:n]))
finalByte = append(finalByte, readBuf[:n]...)
}
}
resourceBuf[resourcePath] = &fyne.StaticResource{
StaticName: fi.Name(),
StaticContent: finalByte,
}
log.D("load resource :" + resourcePath + " success !")
return resourceBuf[resourcePath]
}