323 lines
8.7 KiB
Go
323 lines
8.7 KiB
Go
package utils
|
||
|
||
import (
|
||
"bufio"
|
||
"fmt"
|
||
"io"
|
||
"os"
|
||
"os/user"
|
||
"path/filepath"
|
||
)
|
||
|
||
// AppendFileToFile 将源文件的内容添加到目标文件
|
||
func AppendFileToFile(sourceFile, targetFile string) bool {
|
||
|
||
// 打开源文件
|
||
source, err := os.Open(sourceFile)
|
||
if err != nil {
|
||
log.ErrorF("[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.ErrorF("[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.ErrorF("[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.WarnF("[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.ErrorF("[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.ErrorF("[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.WarnF("[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.ErrorF("[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.ErrorF("[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.ErrorF("[BasicAppendContentToFile] - Error opening file: %s , error is %s", targetFile, err.Error())
|
||
return false
|
||
}
|
||
defer file.Close() // 确保文件最终被关闭
|
||
|
||
// 写入内容到文件
|
||
if _, err := file.WriteString("---"); err != nil {
|
||
log.ErrorF("[BasicAppendContentToFile] - Error writing to file: %s , error is %s", targetFile, err.Error())
|
||
return false
|
||
}
|
||
if _, err := file.WriteString(content); err != nil {
|
||
log.ErrorF("[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.ErrorF("[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()
|
||
}
|
||
|
||
// FileOrFolderExists 文件或者目录是否返回true,不存在返回false
|
||
func FileOrFolderExists(fileFullPath string) bool {
|
||
_, err := os.Stat(fileFullPath)
|
||
return err == nil
|
||
}
|
||
|
||
// FileExistAndNotNull 文件不为空返回true 文件为空返回false
|
||
func FileExistAndNotNull(filename string) bool {
|
||
|
||
// Check if the file exists
|
||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||
log.DebugF("文件 %s 不存在!", filename)
|
||
return false
|
||
}
|
||
|
||
// Open the file for reading
|
||
file, err := os.Open(filename)
|
||
defer file.Close()
|
||
if err != nil {
|
||
log.DebugF("文件 %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
|
||
}
|
||
|
||
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
|
||
}
|
||
|
||
// MoveFolerToAnother 将源文件夹中除了子文件夹外的所有文件移动到目标文件夹
|
||
func MoveFolerToAnother(srcDir, dstDir string) error {
|
||
// 读取源文件夹中的所有条目
|
||
entries, err := os.ReadDir(srcDir)
|
||
if 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)
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// GetCurrentUserFolder 获取运行环境当前用户的根目录
|
||
func GetCurrentUserFolder() string {
|
||
usr, err := user.Current()
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
return ""
|
||
}
|
||
|
||
return usr.HomeDir
|
||
}
|