初始化项目
This commit is contained in:
152
agent-wdd/utils/DownloadUtils.go
Normal file
152
agent-wdd/utils/DownloadUtils.go
Normal file
@@ -0,0 +1,152 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"agent-wdd/log"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func DownloadFile(url string, path string) (bool, string) {
|
||||
// 创建HTTP客户端
|
||||
client := &http.Client{
|
||||
Timeout: 5 * time.Second,
|
||||
}
|
||||
|
||||
return DownloadFileWithClient(client, url, path)
|
||||
}
|
||||
|
||||
// DownloadFileWithClient 使用http客户端下载文件
|
||||
func DownloadFileWithClient(client *http.Client, url string, path string) (bool, string) {
|
||||
|
||||
// path如果是一个目录,则需要获取文件名
|
||||
// 获取url使用 / 分割最后的一部分
|
||||
// 如果path是目录,则需要获取文件名
|
||||
|
||||
if IsDirOrFile(path) {
|
||||
fileName := strings.Split(url, "/")[len(strings.Split(url, "/"))-1]
|
||||
path = filepath.Join(path, fileName)
|
||||
log.Info("path是目录,自动获取文件名为 => : %s", path)
|
||||
}
|
||||
|
||||
return downloadWithProgress(client, url, path)
|
||||
}
|
||||
|
||||
// 带进度显示的下载函数
|
||||
func downloadWithProgress(client *http.Client, url, dest string) (bool, string) {
|
||||
// 创建目标文件
|
||||
file, err := os.Create(dest)
|
||||
if err != nil {
|
||||
return false, fmt.Sprintf("创建文件失败: %s", err.Error())
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// 发起请求
|
||||
resp, err := client.Get(url)
|
||||
if err != nil {
|
||||
return false, fmt.Sprintf("HTTP请求失败: %s", err.Error())
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return false, fmt.Sprintf("服务器返回错误状态码: %s", resp.Status)
|
||||
}
|
||||
|
||||
// 获取文件大小
|
||||
size := resp.ContentLength
|
||||
var downloaded int64
|
||||
|
||||
// 不支持下载超过10GB的文件
|
||||
|
||||
if size > 10*1024*1024*1024 || size < 0 {
|
||||
log.Error("文件大小超过10GB,或者文件大小未知,不支持高级下载方式! 尝试使用wget下载")
|
||||
return downloadFileByWget(url, dest)
|
||||
}
|
||||
|
||||
// 打印下载信息
|
||||
fmt.Printf("开始下载: %s 大小: %s\n", url, HumanSizeInt(size))
|
||||
|
||||
// 创建带进度跟踪的Reader
|
||||
progressReader := &progressReader{
|
||||
Reader: resp.Body,
|
||||
Reporter: func(r int64) {
|
||||
downloaded += r
|
||||
printProgress(downloaded, size)
|
||||
},
|
||||
}
|
||||
|
||||
// 执行拷贝
|
||||
if _, err := io.Copy(file, progressReader); err != nil {
|
||||
return false, fmt.Sprintf("文件拷贝失败: %s", err.Error())
|
||||
}
|
||||
|
||||
fmt.Print("\n") // 保持最后进度显示的完整性
|
||||
return true, fmt.Sprintf("文件下载成功: %s", dest)
|
||||
}
|
||||
|
||||
// 使用wget下载文件
|
||||
func downloadFileByWget(url, dest string) (bool, string) {
|
||||
|
||||
log.Info("使用wget下载文件: %s", fmt.Sprintf("wget %s -qO %s", url, dest))
|
||||
cmd := exec.Command("wget", url, "-qO", dest)
|
||||
_, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return false, fmt.Sprintf("wget下载失败: %s", err.Error())
|
||||
}
|
||||
|
||||
// 检查文件是否存在且不为空
|
||||
fileInfo, err := os.Stat(dest)
|
||||
if err != nil || fileInfo.Size() == 0 {
|
||||
return false, fmt.Sprintf("wget下载失败 文件不存在或为空: %s", dest)
|
||||
}
|
||||
|
||||
return true, fmt.Sprintf("wget下载成功: %s", dest)
|
||||
}
|
||||
|
||||
// 进度跟踪Reader
|
||||
type progressReader struct {
|
||||
io.Reader
|
||||
Reporter func(r int64)
|
||||
}
|
||||
|
||||
func (pr *progressReader) Read(p []byte) (int, error) {
|
||||
n, err := pr.Reader.Read(p)
|
||||
if n > 0 {
|
||||
pr.Reporter(int64(n))
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
// 打印进度信息
|
||||
func printProgress(downloaded, total int64) {
|
||||
const barLength = 40
|
||||
percent := float64(downloaded) / float64(total) * 100
|
||||
|
||||
// 生成进度条
|
||||
filled := int(barLength * downloaded / total)
|
||||
bar := fmt.Sprintf("[%s%s]",
|
||||
strings.Repeat("=", filled),
|
||||
strings.Repeat(" ", barLength-filled))
|
||||
|
||||
// 格式化为人类可读大小
|
||||
humanSize := func(bytes int64) string {
|
||||
const unit = 1024
|
||||
if bytes < unit {
|
||||
return fmt.Sprintf("%d B", bytes)
|
||||
}
|
||||
div, exp := int64(unit), 0
|
||||
for n := bytes / unit; n >= unit; n /= unit {
|
||||
div *= unit
|
||||
exp++
|
||||
}
|
||||
return fmt.Sprintf("%.1f %ciB", float64(bytes)/float64(div), "KMGTPE"[exp])
|
||||
}
|
||||
|
||||
fmt.Printf("\r%-45s %6.2f%% %s/%s", bar, percent,
|
||||
humanSize(downloaded), humanSize(total))
|
||||
}
|
||||
476
agent-wdd/utils/FileUtils.go
Normal file
476
agent-wdd/utils/FileUtils.go
Normal file
@@ -0,0 +1,476 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"agent-wdd/log"
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/user"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// AppendFileToFile 将源文件的内容添加到目标文件
|
||||
func AppendFileToFile(sourceFile, targetFile string) bool {
|
||||
|
||||
// 打开源文件
|
||||
source, err := os.Open(sourceFile)
|
||||
if err != nil {
|
||||
log.Error("[BasicAppendSourceToFile] - error open source file => %s, error is %s", sourceFile, err.Error())
|
||||
return false
|
||||
}
|
||||
defer source.Close()
|
||||
|
||||
// 打开目标文件,如果不存在则创建,如果存在则在末尾追加
|
||||
target, err := os.OpenFile(targetFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Error("[BasicAppendSourceToFile] - error open target file => %s, error is %s", sourceFile, err.Error())
|
||||
return false
|
||||
}
|
||||
defer target.Close()
|
||||
|
||||
// 将源文件内容复制到目标文件
|
||||
_, err = io.Copy(target, source)
|
||||
if err != nil {
|
||||
log.Error("[BasicAppendSourceToFile] - Error appending to target file: %s", err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// AppendOverwriteContentToFile 向目标文件中写入一些内容,覆盖源文件
|
||||
func AppendOverwriteContentToFile(content string, targetFile string) bool {
|
||||
|
||||
err := os.Remove(targetFile)
|
||||
if err != nil {
|
||||
log.Warning("[BasicAppendOverwriteContentToFile] - Error removing file: %s , error is %s", targetFile, err.Error())
|
||||
}
|
||||
|
||||
return AppendContentToFile(content, targetFile)
|
||||
}
|
||||
|
||||
// AppendContentToFile 向目标文件(targetFile 文件的绝对路径)中追加写入一些内容, 如果文件不存在,那么就创建相应的目录及文件
|
||||
func AppendContentToFile(content string, targetFile string) bool {
|
||||
|
||||
// 创建目标文件的目录(递归创建)
|
||||
dir := filepath.Dir(targetFile)
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// 打开文件用于追加。如果文件不存在,将会创建一个新文件。
|
||||
file, err := os.OpenFile(targetFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Error("[BasicAppendContentToFile] - Error opening file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
defer file.Close() // 确保文件最终被关闭
|
||||
|
||||
// 写入内容到文件
|
||||
// 内容非空时执行写入操作
|
||||
if content != "" {
|
||||
if _, err := file.WriteString(content); err != nil {
|
||||
log.Error("[BasicAppendContentToFile] - Error writing to file: %s , error is %s", targetFile, err.Error())
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// AppendOverwriteListContentToFile 将一个字符串列表中的内容,一行一行的写入文件中
|
||||
func AppendOverwriteListContentToFile(contentList []string, targetFile string) bool {
|
||||
|
||||
err := os.Remove(targetFile)
|
||||
if err != nil {
|
||||
log.Warning("[AppendOverwriteListContentToFile] - Error removing file: %s , error is %s", targetFile, err.Error())
|
||||
}
|
||||
|
||||
// 打开文件用于追加。如果文件不存在,将会创建一个新文件。
|
||||
file, err := os.OpenFile(targetFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Error("[AppendOverwriteListContentToFile] - Error opening file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
defer file.Close() // 确保文件最终被关闭
|
||||
|
||||
// 写入内容到文件
|
||||
for _, contentLine := range contentList {
|
||||
//bytes, _ := json.Marshal(contentLine)
|
||||
if _, err := file.WriteString(contentLine + "\n"); err != nil {
|
||||
log.Error("[AppendOverwriteListContentToFile] - Error writing to file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// AppendK8sYamlWithSplitLineToFile 专门为k8s的yaml文件设计的,在每次写入内容之前,先写入一行分隔符
|
||||
func AppendK8sYamlWithSplitLineToFile(content string, targetFile string) bool {
|
||||
|
||||
// 打开文件用于追加。如果文件不存在,将会创建一个新文件。
|
||||
file, err := os.OpenFile(targetFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Error("[BasicAppendContentToFile] - Error opening file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
defer file.Close() // 确保文件最终被关闭
|
||||
|
||||
// 写入内容到文件
|
||||
if _, err := file.WriteString("---"); err != nil {
|
||||
log.Error("[BasicAppendContentToFile] - Error writing to file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
if _, err := file.WriteString(content); err != nil {
|
||||
log.Error("[BasicAppendContentToFile] - Error writing to file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// AppendNullOverWriteToFile 清空一个文件
|
||||
func AppendNullOverWriteToFile(targetFile string) bool {
|
||||
|
||||
// 使用os.O_TRUNC清空文件内容
|
||||
file, err := os.OpenFile(targetFile, os.O_TRUNC|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Error("[AppendNullOverWriteToFile] - Error opening file: %s, error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
defer file.Close() // 确保在函数退出前关闭文件
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func WordSpaceCompletion(source string, totalLength int) string {
|
||||
sourceLength := len(source)
|
||||
|
||||
if sourceLength >= totalLength {
|
||||
return source
|
||||
}
|
||||
|
||||
for i := 0; i < totalLength-sourceLength; i++ {
|
||||
source += " "
|
||||
}
|
||||
|
||||
return source
|
||||
}
|
||||
|
||||
// IsDirOrFile 如果是目录则返回true,是文件则返回false
|
||||
func IsDirOrFile(path string) bool {
|
||||
info, err := os.Stat(path)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return info.IsDir()
|
||||
}
|
||||
|
||||
// FileExists 文件存在返回true,不存在返回false,如果文件是一个目录,也返回false
|
||||
func FileExists(fileFullPath string) bool {
|
||||
info, err := os.Stat(fileFullPath)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return !info.IsDir()
|
||||
}
|
||||
|
||||
// CreateFolder 创建文件夹,如果文件夹存在,则返回true,否则返回false
|
||||
func CreateFolder(folderName string) bool {
|
||||
// 递归创建 类似于 mkdir -p folderName
|
||||
if _, err := os.Stat(folderName); os.IsNotExist(err) {
|
||||
return os.MkdirAll(folderName, 0755) == nil
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// FileOrFolderExists 文件或者目录是否返回true,不存在返回false
|
||||
func FileOrFolderExists(fileFullPath string) bool {
|
||||
_, err := os.Stat(fileFullPath)
|
||||
return !os.IsNotExist(err)
|
||||
}
|
||||
|
||||
// FileExistAndNotNull 文件不为空返回true 文件为空返回false
|
||||
func FileExistAndNotNull(filename string) bool {
|
||||
|
||||
// Check if the file exists
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
log.Debug("文件 %s 不存在!", filename)
|
||||
return false
|
||||
}
|
||||
|
||||
// Open the file for reading
|
||||
file, err := os.Open(filename)
|
||||
defer file.Close()
|
||||
if err != nil {
|
||||
log.Debug("文件 %s 打开有误!", filename)
|
||||
return false // Handle error according to your needs
|
||||
}
|
||||
|
||||
// Get the file size
|
||||
info, _ := file.Stat()
|
||||
size := info.Size()
|
||||
|
||||
// Check if the file is not empty
|
||||
return size > 0
|
||||
}
|
||||
|
||||
// ListAllFileInFolder 列出一个目录中的所有文件,返回文件名,忽略folder,不带全路径
|
||||
func ListAllFileInFolder(folderName string) ([]string, error) {
|
||||
return listAllFileInFolderWithFullPath(folderName, false)
|
||||
}
|
||||
|
||||
func ListAllFileInFolderWithFullPath(folderName string) ([]string, error) {
|
||||
return listAllFileInFolderWithFullPath(folderName, true)
|
||||
}
|
||||
|
||||
func listAllFileInFolderWithFullPath(folderName string, fullPath bool) ([]string, error) {
|
||||
files := make([]string, 0)
|
||||
err := filepath.Walk(folderName, func(path string, info os.FileInfo, err error) error {
|
||||
if !info.IsDir() {
|
||||
if fullPath {
|
||||
files = append(files, path)
|
||||
} else {
|
||||
files = append(files, info.Name())
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return files, nil
|
||||
}
|
||||
|
||||
// RemoveFile 删除文件,如果文件不存在,则返回true
|
||||
func RemoveFile(filePath string) bool {
|
||||
|
||||
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
||||
log.Error("文件不存在: %s", filePath)
|
||||
return true
|
||||
}
|
||||
err := os.Remove(filePath)
|
||||
if err != nil {
|
||||
log.Error("Failed to remove file: %s", err.Error())
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func RemoveFolderComplete(folderName string) bool {
|
||||
|
||||
err := filepath.Walk(folderName,
|
||||
func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !info.IsDir() {
|
||||
return os.Remove(path)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
err = os.RemoveAll(folderName)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func ReadAllContentFromFile(fileFullPath string) (result []string) {
|
||||
|
||||
f, err := os.Open(fileFullPath)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return result
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
if len(line) > 0 { // ignore empty lines
|
||||
result = append(result, line)
|
||||
}
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
fmt.Println(err)
|
||||
return result
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// FindContentInFile 在文件中查找内容,如果存在,则返回true,否则返回false 类似于grep -q content targetFile
|
||||
func FindContentInFile(content string, targetFile string) bool {
|
||||
|
||||
// 读取文件内容
|
||||
fileContent, err := os.ReadFile(targetFile)
|
||||
if err != nil {
|
||||
log.Error("[FindContentInFile] - Error reading file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
// 将文件内容按行分割
|
||||
lines := strings.Split(string(fileContent), "\n")
|
||||
|
||||
// 遍历每一行
|
||||
for _, line := range lines {
|
||||
if strings.Contains(line, content) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// FindAndReplaceContentInFile 在文件中查找内容,如果存在,则替换,如果存在多个,则替换全部 类似于sed -i 's/oldContent/newContent/g' targetFile
|
||||
func FindAndReplaceContentInFile(oldContent string, newContent string, targetFile string) bool {
|
||||
|
||||
// 读取文件内容
|
||||
fileContent, err := os.ReadFile(targetFile)
|
||||
if err != nil {
|
||||
log.Error("[FindAndReplaceContentInFile] - Error reading file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
// 将文件内容按行分割
|
||||
lines := strings.Split(string(fileContent), "\n")
|
||||
|
||||
// 遍历每一行
|
||||
for i, line := range lines {
|
||||
if strings.Contains(line, oldContent) {
|
||||
lines[i] = strings.Replace(line, oldContent, newContent, -1)
|
||||
}
|
||||
}
|
||||
|
||||
// 将修改后的内容写回文件
|
||||
err = os.WriteFile(targetFile, []byte(strings.Join(lines, "\n")), 0644)
|
||||
if err != nil {
|
||||
log.Error("[FindAndReplaceContentInFile] - Error writing file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// FindAndDeleteContentInFile 在文件中查找内容,如果存在,则删除,如果存在多个,则删除全部 类似于sed -i '/content/d' targetFile
|
||||
func FindAndDeleteContentInFile(content string, targetFile string) bool {
|
||||
|
||||
// 读取文件内容
|
||||
fileContent, err := os.ReadFile(targetFile)
|
||||
if err != nil {
|
||||
log.Error("[FindAndDeleteContentInFile] - Error reading file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
// 将文件内容按行分割
|
||||
lines := strings.Split(string(fileContent), "\n")
|
||||
|
||||
// 过滤掉包含指定内容的行
|
||||
var newLines []string
|
||||
for _, line := range lines {
|
||||
if !strings.Contains(line, content) {
|
||||
newLines = append(newLines, line)
|
||||
}
|
||||
}
|
||||
|
||||
// 将过滤后的内容写回文件
|
||||
err = os.WriteFile(targetFile, []byte(strings.Join(newLines, "\n")), 0644)
|
||||
if err != nil {
|
||||
log.Error("[FindAndDeleteContentInFile] - Error writing file: %s , error is %s", targetFile, err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// MoveFileToAnother 将源文件移动到目标文件
|
||||
func MoveFileToAnother(srcFile, dstFile string) error {
|
||||
|
||||
// 如果dstFile是目录,则将srcFile移动到dstFile目录下
|
||||
if IsDirOrFile(dstFile) {
|
||||
dstFile = filepath.Join(dstFile, filepath.Base(srcFile))
|
||||
}
|
||||
|
||||
// 如果目标文件存在,则删除目标文件
|
||||
if FileExists(dstFile) {
|
||||
err := os.Remove(dstFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("删除目标文件失败: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 如果源文件不存在,则返回错误
|
||||
if !FileExists(srcFile) {
|
||||
return fmt.Errorf("源文件不存在: %s", srcFile)
|
||||
}
|
||||
|
||||
// 如果目标文件夹不存在,则创建目标文件夹
|
||||
if !FileExists(filepath.Dir(dstFile)) {
|
||||
err := os.MkdirAll(filepath.Dir(dstFile), os.ModePerm)
|
||||
if err != nil {
|
||||
return fmt.Errorf("创建目标文件夹失败: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 移动文件
|
||||
return os.Rename(srcFile, dstFile)
|
||||
}
|
||||
|
||||
// MoveFolerToAnother 将源文件夹的所有文件递归移动到目标文件夹
|
||||
func MoveFolerToAnother(srcDir, dstDir string) error {
|
||||
// 读取源文件夹中的所有条目
|
||||
entries, err := os.ReadDir(srcDir)
|
||||
if err != nil {
|
||||
return fmt.Errorf("读取源文件夹失败: %w", err)
|
||||
}
|
||||
|
||||
// 创建目标文件夹(如果不存在)
|
||||
if err := os.MkdirAll(dstDir, os.ModePerm); err != nil {
|
||||
return fmt.Errorf("创建目标文件夹失败: %w", err)
|
||||
}
|
||||
|
||||
// 遍历所有条目
|
||||
for _, entry := range entries {
|
||||
srcPath := filepath.Join(srcDir, entry.Name())
|
||||
dstPath := filepath.Join(dstDir, entry.Name())
|
||||
|
||||
// 如果是文件夹,递归处理
|
||||
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 获取运行环境当前用户的根目录
|
||||
func GetCurrentUserFolder() string {
|
||||
usr, err := user.Current()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return ""
|
||||
}
|
||||
|
||||
return usr.HomeDir
|
||||
}
|
||||
40
agent-wdd/utils/FormatUtils.go
Normal file
40
agent-wdd/utils/FormatUtils.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package utils
|
||||
|
||||
import "strconv"
|
||||
|
||||
func HumanSize(bytes uint64) string {
|
||||
units := []string{"B", "KB", "MB", "GB", "TB", "PB"}
|
||||
var unitIndex int
|
||||
size := float64(bytes)
|
||||
|
||||
for size >= 1024 && unitIndex < len(units)-1 {
|
||||
size /= 1024
|
||||
unitIndex++
|
||||
}
|
||||
|
||||
if unitIndex == 0 {
|
||||
return strconv.FormatUint(bytes, 10) + units[unitIndex]
|
||||
}
|
||||
|
||||
return strconv.FormatFloat(size, 'f', 1, 64) + units[unitIndex]
|
||||
}
|
||||
|
||||
func HumanSizeInt(bytes int64) string {
|
||||
return HumanSize(uint64(bytes))
|
||||
}
|
||||
|
||||
func HumanDiskSize(bytes uint64) string {
|
||||
units := []string{"B", "KB", "MB", "GB", "TB", "PB"}
|
||||
var unitIndex int
|
||||
size := float64(bytes)
|
||||
|
||||
for size >= 1000 && unitIndex < len(units)-1 {
|
||||
size /= 1000
|
||||
unitIndex++
|
||||
}
|
||||
|
||||
if unitIndex == 0 {
|
||||
return strconv.FormatUint(bytes, 10) + units[unitIndex]
|
||||
}
|
||||
return strconv.FormatFloat(size, 'f', 1, 64) + units[unitIndex]
|
||||
}
|
||||
1
agent-wdd/utils/HttpUtils.go
Normal file
1
agent-wdd/utils/HttpUtils.go
Normal file
@@ -0,0 +1 @@
|
||||
package utils
|
||||
1
agent-wdd/utils/ObjectUtils.go
Normal file
1
agent-wdd/utils/ObjectUtils.go
Normal file
@@ -0,0 +1 @@
|
||||
package utils
|
||||
55
agent-wdd/utils/PrintUtils.go
Normal file
55
agent-wdd/utils/PrintUtils.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"agent-wdd/log"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func BeautifulPrint(object interface{}) {
|
||||
|
||||
bytes, err := json.MarshalIndent(object, "", " ")
|
||||
if err != nil {
|
||||
log.Error("[BeautifulPrint] - json marshal error ! => %v", object)
|
||||
}
|
||||
|
||||
fmt.Println()
|
||||
fmt.Println(string(bytes))
|
||||
fmt.Println()
|
||||
|
||||
}
|
||||
|
||||
func BeautifulPrintToString(object interface{}) string {
|
||||
|
||||
bytes, err := json.MarshalIndent(object, "", " ")
|
||||
if err != nil {
|
||||
log.Error("[BeautifulPrint] - json marshal error ! => %v", object)
|
||||
}
|
||||
|
||||
return string(bytes)
|
||||
}
|
||||
|
||||
func BeautifulPrintWithTitle(contend any, title string) {
|
||||
|
||||
fmt.Println()
|
||||
fmt.Println(">>>>>>>> " + title + " <<<<<<<<")
|
||||
bytes, _ := json.MarshalIndent(contend, "", " ")
|
||||
fmt.Println(string(bytes))
|
||||
fmt.Println(">>>>>>>> end <<<<<<<<")
|
||||
}
|
||||
|
||||
func BeautifulPrintListWithTitle(contend []string, title string) {
|
||||
|
||||
fmt.Println()
|
||||
fmt.Println(">>>>>>>> " + title + " <<<<<<<<")
|
||||
for _, line := range contend {
|
||||
fmt.Println(line)
|
||||
}
|
||||
fmt.Println(">>>>>>>> end <<<<<<<<")
|
||||
}
|
||||
|
||||
func SplitLinePrint() {
|
||||
fmt.Println()
|
||||
fmt.Println()
|
||||
fmt.Println()
|
||||
}
|
||||
24
agent-wdd/utils/TimeUtils.go
Normal file
24
agent-wdd/utils/TimeUtils.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
const defaultTimeString = "2011-11-11 11:11:11"
|
||||
|
||||
func CurrentTimeString() string {
|
||||
|
||||
// 加载东八区时区
|
||||
loc, err := time.LoadLocation("Asia/Shanghai")
|
||||
if err != nil {
|
||||
fmt.Println("无法加载时区:", err)
|
||||
return defaultTimeString
|
||||
}
|
||||
|
||||
// 获取当前时间并转换为东八区时间
|
||||
now := time.Now().In(loc)
|
||||
// 格式化为 "2006-01-02 15:04:05" 的布局
|
||||
formattedTime := now.Format(time.DateTime)
|
||||
return formattedTime
|
||||
}
|
||||
152
agent-wdd/utils/ZipUtils.go
Normal file
152
agent-wdd/utils/ZipUtils.go
Normal file
@@ -0,0 +1,152 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"agent-wdd/log"
|
||||
"archive/tar"
|
||||
"archive/zip"
|
||||
"compress/gzip"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// UnzipFile 解压文件, 支持zip tgz tar.gz tar
|
||||
func UnzipFile(zipFile string, targetFolder string) {
|
||||
log.Info("解压文件: %s, 到: %s", zipFile, targetFolder)
|
||||
|
||||
// 检查文件扩展名以确定解压缩方法
|
||||
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