feat(filex): 自 go-hua/common 迁入文件目录工具并独立成包

- 运行目录定位、路径存在性、带进度回调下载、Zip 打包/解压(兼容 GBK 中文文件名)
- 附单元测试、examples/filex 例程与包 README
This commit is contained in:
2026-09-20 12:20:50 +08:00
parent ca9dedaf82
commit c7e8eb14f8
7 changed files with 463 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
// Package filex 文件与目录工具:工作目录/运行目录定位、路径存在性判断、
// 带进度回调的文件下载、Zip 打包与解压(兼容 GBK 中文文件名)。
package filex
import (
"os"
"path"
"path/filepath"
"runtime"
"strings"
)
// 获取工作目录
func GetWorkDir() string {
str, _ := os.Getwd()
return str
}
// trimmedPath 规范化路径并去掉末尾分隔符
func trimmedPath(file string) string {
idx := strings.LastIndexByte(file, '/')
if idx == -1 {
return file
}
// Find the penultimate separator.
idx = strings.LastIndexByte(file[:idx], '/')
if idx == -1 {
return file
}
return file[:idx+1]
}
// 最终方案-全兼容
func GetRunDir() string {
dir := getCurrentAbPathByExecutable()
if strings.Contains(dir, getTmpDir()) {
dir = GetWorkDir()
}
// 结尾不是分隔符时补上(原写法用 || 恒为 true,行为等价但触发 vet 告警)
if dir[len(dir)-1:] != "/" && dir[len(dir)-1:] != "\\" {
dir += string(filepath.Separator)
}
return dir
}
// 获取系统临时目录,兼容go run
func getTmpDir() string {
dir := os.Getenv("TEMP")
if dir == "" {
dir = os.Getenv("TMP")
}
res, _ := filepath.EvalSymlinks(dir)
// 取父目录
dir = filepath.Dir(res)
return dir
}
// 获取当前执行文件绝对路径 (go build)
func getCurrentAbPathByExecutable() string {
exePath, err := os.Executable()
if err != nil {
return ""
}
res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))
return res
}
// 获取当前执行文件绝对路径(go run)
func GetCurrentAbPathByCaller() string {
var abPath string
_, filename, _, ok := runtime.Caller(0)
if ok {
abPath = path.Dir(filename)
}
abPath = trimmedPath(filename)
return abPath
}