U:调整为工具函数
This commit is contained in:
1 parent
cf48204070
commit
f1d9764d1d
2 files changed
+149
-81
No files matched your search
+2
-81
@@ -5,7 +5,6 @@ import (
|
|||||||
"embed"
|
"embed"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@@ -18,6 +17,7 @@ import (
|
|||||||
"rear/internal/router"
|
"rear/internal/router"
|
||||||
"rear/internal/service"
|
"rear/internal/service"
|
||||||
"rear/pkg/logger"
|
"rear/pkg/logger"
|
||||||
|
"rear/pkg/utils"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -59,17 +59,13 @@ func main() {
|
|||||||
// 将 CLI 放到到运行目录
|
// 将 CLI 放到到运行目录
|
||||||
join := filepath.Join(execDir, "tools", "exiftool")
|
join := filepath.Join(execDir, "tools", "exiftool")
|
||||||
srcDir := `.\tools\windows_amd64\exiftool\exiftool` // 源目录
|
srcDir := `.\tools\windows_amd64\exiftool\exiftool` // 源目录
|
||||||
//destDir := `.\build\tools\exiftool` // 目标目录
|
|
||||||
|
|
||||||
// 复制整个目录
|
// 复制整个目录
|
||||||
if err := copyDirectory(srcDir, join); err != nil {
|
if err := utils.CopyDir(srcDir, join); err != nil {
|
||||||
fmt.Printf("复制失败: %v\n", err)
|
fmt.Printf("复制失败: %v\n", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化外部(CLI)工具管理
|
|
||||||
// utils.EnsureInitialized()
|
|
||||||
|
|
||||||
//if err := initDatabase(); err != nil {
|
//if err := initDatabase(); err != nil {
|
||||||
// logger.Fatalf("Failed to initialize database: %v", err)
|
// logger.Fatalf("Failed to initialize database: %v", err)
|
||||||
//}
|
//}
|
||||||
@@ -145,78 +141,3 @@ func startHttp(con *container.Container) {
|
|||||||
|
|
||||||
logger.Info("Server exited")
|
logger.Info("Server exited")
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyDirectory(src, dest string) error {
|
|
||||||
|
|
||||||
// 获取源目录信息
|
|
||||||
srcInfo, err := os.Stat(src)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("源目录不存在: %s, 错误: %v", src, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建目标目录
|
|
||||||
if err := os.MkdirAll(dest, srcInfo.Mode()); err != nil {
|
|
||||||
return fmt.Errorf("创建目标目录失败: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 读取源目录内容
|
|
||||||
entries, err := os.ReadDir(src)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("读取源目录失败: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 遍历并复制每个文件/目录
|
|
||||||
for _, entry := range entries {
|
|
||||||
srcPath := filepath.Join(src, entry.Name())
|
|
||||||
destPath := filepath.Join(dest, entry.Name())
|
|
||||||
|
|
||||||
if entry.IsDir() {
|
|
||||||
// 递归复制子目录
|
|
||||||
if err := copyDirectory(srcPath, destPath); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 复制文件
|
|
||||||
if err := copyFile(srcPath, destPath); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func copyFile(src, dest string) error {
|
|
||||||
// 打开源文件
|
|
||||||
srcFile, err := os.Open(src)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer srcFile.Close()
|
|
||||||
|
|
||||||
// 获取源文件信息
|
|
||||||
srcInfo, err := srcFile.Stat()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 确保目标目录存在
|
|
||||||
if err := os.MkdirAll(filepath.Dir(dest), 0755); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建目标文件
|
|
||||||
destFile, err := os.Create(dest)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer destFile.Close()
|
|
||||||
|
|
||||||
// 复制文件内容
|
|
||||||
if _, err := io.Copy(destFile, srcFile); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置文件权限
|
|
||||||
return os.Chmod(dest, srcInfo.Mode())
|
|
||||||
}
|
|
||||||
@@ -233,6 +233,12 @@ func CopyFile(src, dst string) error {
|
|||||||
}
|
}
|
||||||
defer sourceFile.Close()
|
defer sourceFile.Close()
|
||||||
|
|
||||||
|
// 获取源文件信息
|
||||||
|
srcInfo, err := sourceFile.Stat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// 确保目标目录存在
|
// 确保目标目录存在
|
||||||
dstDir := filepath.Dir(dst)
|
dstDir := filepath.Dir(dst)
|
||||||
if err := CreateDir(dstDir); err != nil {
|
if err := CreateDir(dstDir); err != nil {
|
||||||
@@ -250,9 +256,150 @@ func CopyFile(src, dst string) error {
|
|||||||
return fmt.Errorf("复制文件失败: %w", err)
|
return fmt.Errorf("复制文件失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置文件权限
|
||||||
|
return os.Chmod(dst, srcInfo.Mode())
|
||||||
|
}
|
||||||
|
|
||||||
|
// CopyDir 递归复制整个目录
|
||||||
|
func CopyDir(src, dst string) error {
|
||||||
|
// 获取源目录信息
|
||||||
|
srcInfo, err := os.Stat(src)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("获取源目录信息失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保源路径是一个目录
|
||||||
|
if !srcInfo.IsDir() {
|
||||||
|
return fmt.Errorf("源路径不是目录: %s", src)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建目标目录
|
||||||
|
if err := os.MkdirAll(dst, srcInfo.Mode()); err != nil {
|
||||||
|
return fmt.Errorf("创建目标目录失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取源目录内容
|
||||||
|
entries, err := os.ReadDir(src)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("读取源目录失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 遍历源目录中的每个条目
|
||||||
|
for _, entry := range entries {
|
||||||
|
srcPath := filepath.Join(src, entry.Name())
|
||||||
|
dstPath := filepath.Join(dst, entry.Name())
|
||||||
|
|
||||||
|
if entry.IsDir() {
|
||||||
|
// 如果是目录,递归复制
|
||||||
|
if err := CopyDir(srcPath, dstPath); err != nil {
|
||||||
|
return fmt.Errorf("复制子目录 %s 失败: %w", entry.Name(), err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 如果是文件,使用你的 CopyFile 函数
|
||||||
|
if err := CopyFile(srcPath, dstPath); err != nil {
|
||||||
|
return fmt.Errorf("复制文件 %s 失败: %w", entry.Name(), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CopyDirWithOptions 带选项的目录复制函数
|
||||||
|
type CopyOptions struct {
|
||||||
|
Overwrite bool // 是否覆盖已存在的文件
|
||||||
|
SkipSymlinks bool // 是否跳过符号链接
|
||||||
|
}
|
||||||
|
|
||||||
|
func CopyDirWithOptions(src, dst string, opts *CopyOptions) error {
|
||||||
|
if opts == nil {
|
||||||
|
opts = &CopyOptions{Overwrite: true, SkipSymlinks: false}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取源目录信息
|
||||||
|
srcInfo, err := os.Stat(src)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("获取源目录信息失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !srcInfo.IsDir() {
|
||||||
|
return fmt.Errorf("源路径不是目录: %s", src)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查目标目录是否已存在
|
||||||
|
if dstInfo, err := os.Stat(dst); err == nil {
|
||||||
|
if !dstInfo.IsDir() {
|
||||||
|
return fmt.Errorf("目标路径已存在但不是目录: %s", dst)
|
||||||
|
}
|
||||||
|
if !opts.Overwrite {
|
||||||
|
return fmt.Errorf("目标目录已存在: %s", dst)
|
||||||
|
}
|
||||||
|
} else if !os.IsNotExist(err) {
|
||||||
|
return fmt.Errorf("检查目标目录失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建目标目录
|
||||||
|
if err := os.MkdirAll(dst, srcInfo.Mode()); err != nil {
|
||||||
|
return fmt.Errorf("创建目标目录失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取源目录内容
|
||||||
|
entries, err := os.ReadDir(src)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("读取源目录失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, entry := range entries {
|
||||||
|
srcPath := filepath.Join(src, entry.Name())
|
||||||
|
dstPath := filepath.Join(dst, entry.Name())
|
||||||
|
|
||||||
|
// 处理符号链接
|
||||||
|
if entry.Type()&os.ModeSymlink != 0 {
|
||||||
|
if opts.SkipSymlinks {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := copySymlink(srcPath, dstPath); err != nil {
|
||||||
|
return fmt.Errorf("复制符号链接 %s 失败: %w", entry.Name(), err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if entry.IsDir() {
|
||||||
|
// 递归复制子目录
|
||||||
|
if err := CopyDirWithOptions(srcPath, dstPath, opts); err != nil {
|
||||||
|
return fmt.Errorf("复制子目录 %s 失败: %w", entry.Name(), err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 检查文件是否已存在
|
||||||
|
if !opts.Overwrite {
|
||||||
|
if _, err := os.Stat(dstPath); err == nil {
|
||||||
|
return fmt.Errorf("目标文件已存在: %s", dstPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 复制文件
|
||||||
|
if err := CopyFile(srcPath, dstPath); err != nil {
|
||||||
|
return fmt.Errorf("复制文件 %s 失败: %w", entry.Name(), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// copySymlink 复制符号链接
|
||||||
|
func copySymlink(src, dst string) error {
|
||||||
|
link, err := os.Readlink(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除可能已存在的目标文件/链接
|
||||||
|
os.Remove(dst)
|
||||||
|
|
||||||
|
return os.Symlink(link, dst)
|
||||||
|
}
|
||||||
|
|
||||||
// 11. 移动/重命名文件
|
// 11. 移动/重命名文件
|
||||||
func MoveFile(src, dst string) error {
|
func MoveFile(src, dst string) error {
|
||||||
// 确保目标目录存在
|
// 确保目标目录存在
|
||||||
|
|||||||
Reference in new issue
Block a user