68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"embed"
|
|
"fmt"
|
|
"io/fs"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
//go:embed ip2region/*
|
|
var embeddedFS embed.FS
|
|
|
|
func releaseEmbeddedDir(efs embed.FS, embedPath string, targetDir string) error {
|
|
return fs.WalkDir(efs, embedPath, func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
relPath, _ := filepath.Rel(embedPath, path)
|
|
targetPath := filepath.Join(targetDir, relPath)
|
|
|
|
if d.IsDir() {
|
|
return os.MkdirAll(targetPath, 0755)
|
|
}
|
|
|
|
data, err := efs.ReadFile(path)
|
|
if err != nil {
|
|
return fmt.Errorf("读取嵌入文件失败: %w", err)
|
|
}
|
|
|
|
// 如果文件已存在就跳过(可选)
|
|
if _, err := os.Stat(targetPath); err == nil {
|
|
log.Printf(" 文件已存在: %s, 跳过写入\n", targetPath)
|
|
return nil
|
|
}
|
|
|
|
err = os.WriteFile(targetPath, data, 0644)
|
|
if err != nil {
|
|
return fmt.Errorf("写入文件失败: %w", err)
|
|
}
|
|
|
|
log.Printf(" 释放: %s → %s\n", path, targetPath)
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func embed_ip2region() {
|
|
log.Println(" 正在释放 ip2region 数据...")
|
|
|
|
err := releaseEmbeddedDir(embeddedFS, "ip2region", "ip2region")
|
|
if err != nil {
|
|
log.Println(" 释放失败:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
log.Println(" 释放完成,程序继续执行...")
|
|
|
|
// 你可以在这里使用 ip2region.xdb 文件了,例如:
|
|
if _, err := os.Stat("ip2region/ip2region.xdb"); err == nil {
|
|
log.Println(" ✅ 确认 ip2region.xdb 已成功写出")
|
|
// 这里可以调用 ip2region 逻辑加载它
|
|
} else {
|
|
log.Println(" ❌ 找不到 ip2region.xdb")
|
|
}
|
|
}
|