package utils import ( "bufio" "fmt" "io" "os" "path/filepath" ) // AppendSourceToFile 将源文件的内容添加到目标文件,使用golang标准库完成,跨平台、安全性更强 func AppendSourceToFile(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 向目标文件中追加写入一些内容 func AppendContentToFile(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(content); err != nil { log.ErrorF("[BasicAppendContentToFile] - Error writing to file: %s , error is %s", targetFile, err.Error()) return false } return true } // AppendContentWithSplitLineToFile 专门为k8s的yaml文件设计的,在每次写入内容之前,先写入一行分隔符 func AppendContentWithSplitLineToFile(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 } // AppendNullToFile 清空一个文件 func AppendNullToFile(targetFile string) bool { // 使用os.O_TRUNC清空文件内容 file, err := os.OpenFile(targetFile, os.O_TRUNC|os.O_WRONLY, 0644) if err != nil { log.ErrorF("[AppendNullToFile] - 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, 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 ReadLineFromFile(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 }