愉快的使用cursor
This commit is contained in:
@@ -283,7 +283,7 @@ func ReadAllContentFromFile(fileFullPath string) (result []string) {
|
||||
return result
|
||||
}
|
||||
|
||||
// MoveFolerToAnother 将源文件夹中除了子文件夹外的所有文件移动到目标文件夹
|
||||
// MoveFolerToAnother 将源文件夹的所有文件递归移动到目标文件夹
|
||||
func MoveFolerToAnother(srcDir, dstDir string) error {
|
||||
// 读取源文件夹中的所有条目
|
||||
entries, err := os.ReadDir(srcDir)
|
||||
@@ -291,24 +291,36 @@ func MoveFolerToAnother(srcDir, dstDir string) error {
|
||||
return fmt.Errorf("读取源文件夹失败: %w", err)
|
||||
}
|
||||
|
||||
// 创建目标文件夹(如果不存在)
|
||||
if err := os.MkdirAll(dstDir, os.ModePerm); err != nil {
|
||||
return fmt.Errorf("创建目标文件夹失败: %w", err)
|
||||
}
|
||||
|
||||
// 遍历所有条目
|
||||
for _, entry := range entries {
|
||||
// 跳过子文件夹
|
||||
if entry.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
// 构造源文件路径和目标文件路径
|
||||
srcPath := filepath.Join(srcDir, entry.Name())
|
||||
dstPath := filepath.Join(dstDir, entry.Name())
|
||||
|
||||
// 移动文件
|
||||
if err := os.Rename(srcPath, dstPath); err != nil {
|
||||
return fmt.Errorf("移动文件失败: %w", err)
|
||||
// 如果是文件夹,递归处理
|
||||
if entry.IsDir() {
|
||||
if err := MoveFolerToAnother(srcPath, dstPath); err != nil {
|
||||
return fmt.Errorf("递归移动文件夹失败: %w", err)
|
||||
}
|
||||
} else {
|
||||
// 移动文件
|
||||
if err := os.Rename(srcPath, dstPath); err != nil {
|
||||
return fmt.Errorf("移动文件失败: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 删除源文件夹
|
||||
if err := os.RemoveAll(srcDir); err != nil {
|
||||
return fmt.Errorf("删除源文件夹失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
// GetCurrentUserFolder 获取运行环境当前用户的根目录
|
||||
|
||||
150
agent-wdd/utils/ZipUtils.go
Normal file
150
agent-wdd/utils/ZipUtils.go
Normal file
@@ -0,0 +1,150 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"agent-wdd/log"
|
||||
"archive/tar"
|
||||
"archive/zip"
|
||||
"compress/gzip"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// UnzipFile 解压文件, 支持zip和tar.gz
|
||||
func UnzipFile(zipFile string, targetFolder string) {
|
||||
// 检查文件扩展名以确定解压缩方法
|
||||
fileExt := filepath.Ext(zipFile)
|
||||
switch fileExt {
|
||||
case ".zip":
|
||||
// 使用标准库中的archive/zip包进行解压缩
|
||||
zipReader, err := zip.OpenReader(zipFile)
|
||||
if err != nil {
|
||||
log.Error("无法打开ZIP文件: %s, 错误: %s", zipFile, err.Error())
|
||||
return
|
||||
}
|
||||
defer zipReader.Close()
|
||||
|
||||
// 创建目标文件夹
|
||||
if err := os.MkdirAll(targetFolder, 0755); err != nil {
|
||||
log.Error("无法创建目标文件夹: %s, 错误: %s", targetFolder, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 遍历ZIP文件中的所有文件
|
||||
for _, file := range zipReader.File {
|
||||
zippedFile, err := file.Open()
|
||||
if err != nil {
|
||||
log.Error("无法打开ZIP中的文件: %s, 错误: %s", file.Name, err.Error())
|
||||
continue
|
||||
}
|
||||
defer zippedFile.Close()
|
||||
|
||||
// 构建目标文件路径
|
||||
targetFilePath := filepath.Join(targetFolder, file.Name)
|
||||
|
||||
// 如果是目录,则创建目录
|
||||
if file.FileInfo().IsDir() {
|
||||
if err := os.MkdirAll(targetFilePath, file.Mode()); err != nil {
|
||||
log.Error("无法创建目录: %s, 错误: %s", targetFilePath, err.Error())
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
// 如果是文件,则创建文件并写入内容
|
||||
if err := os.MkdirAll(filepath.Dir(targetFilePath), 0755); err != nil {
|
||||
log.Error("无法创建文件的父目录: %s, 错误: %s", filepath.Dir(targetFilePath), err.Error())
|
||||
continue
|
||||
}
|
||||
targetFile, err := os.OpenFile(targetFilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
|
||||
if err != nil {
|
||||
log.Error("无法创建目标文件: %s, 错误: %s", targetFilePath, err.Error())
|
||||
continue
|
||||
}
|
||||
defer targetFile.Close()
|
||||
|
||||
if _, err := io.Copy(targetFile, zippedFile); err != nil {
|
||||
log.Error("无法写入文件内容: %s, 错误: %s", targetFilePath, err.Error())
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case ".tar", ".tar.gz", ".tgz":
|
||||
// 使用标准库中的archive/tar包进行解压缩
|
||||
var file *os.File
|
||||
var err error
|
||||
if fileExt == ".tar.gz" || fileExt == ".tgz" {
|
||||
file, err = os.Open(zipFile)
|
||||
if err != nil {
|
||||
log.Error("无法打开TAR.GZ文件: %s, 错误: %s", zipFile, err.Error())
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
gzipReader, err := gzip.NewReader(file)
|
||||
if err != nil {
|
||||
log.Error("无法创建GZIP读取器: %s, 错误: %s", zipFile, err.Error())
|
||||
return
|
||||
}
|
||||
defer gzipReader.Close()
|
||||
|
||||
tarReader := tar.NewReader(gzipReader)
|
||||
if err := extractTar(tarReader, targetFolder); err != nil {
|
||||
log.Error("解压TAR.GZ文件时出错: %s, 错误: %s", zipFile, err.Error())
|
||||
return
|
||||
}
|
||||
} else {
|
||||
file, err = os.Open(zipFile)
|
||||
if err != nil {
|
||||
log.Error("无法打开TAR文件: %s, 错误: %s", zipFile, err.Error())
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
tarReader := tar.NewReader(file)
|
||||
if err := extractTar(tarReader, targetFolder); err != nil {
|
||||
log.Error("解压TAR文件时出错: %s, 错误: %s", zipFile, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
log.Error("不支持的文件类型: %s", fileExt)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 辅助函数,用于解压TAR文件
|
||||
func extractTar(tarReader *tar.Reader, targetFolder string) error {
|
||||
for {
|
||||
header, err := tarReader.Next()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
targetFilePath := filepath.Join(targetFolder, header.Name)
|
||||
|
||||
switch header.Typeflag {
|
||||
case tar.TypeDir:
|
||||
if err := os.MkdirAll(targetFilePath, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
case tar.TypeReg:
|
||||
if err := os.MkdirAll(filepath.Dir(targetFilePath), 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
file, err := os.OpenFile(targetFilePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, os.FileMode(header.Mode))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if _, err := io.Copy(file, tarReader); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user