Files
SafeLine/management/tcontrollerd/utils/file.go
2024-07-04 17:54:34 +08:00

127 lines
2.3 KiB
Go

package utils
import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
)
func EnsureDir(dir string) error {
if _, err := os.Stat(dir); os.IsNotExist(err) {
return os.MkdirAll(dir, os.FileMode(0755))
}
return nil
}
func EnsureFileDir(path string) error {
return EnsureDir(filepath.Dir(path))
}
func FileExist(path string) (bool, error) {
stat, err := os.Stat(path)
if err != nil {
if os.IsNotExist(err) {
return false, nil
} else {
return false, err
}
} else {
if stat.IsDir() {
return false, fmt.Errorf("%s is dir", path)
} else {
return true, nil
}
}
}
func FilesExist(paths ...string) (bool, error) {
for _, path := range paths {
exist, err := FileExist(path)
if err != nil {
return false, err
}
if !exist {
return false, nil
}
}
return true, nil
}
func RenameWriteFile(filename string, data []byte, perm os.FileMode) error {
randFileName := filename + ".tmp." + RandStr(8)
if err := ioutil.WriteFile(randFileName, data, perm); err != nil {
return err
}
return os.Rename(randFileName, filename)
}
func EnsureRenameWriteFile(path string, data []byte, mode os.FileMode) error {
err := EnsureFileDir(path)
if err != nil {
return err
}
return RenameWriteFile(path, data, mode)
}
func EnsureWriteFile(path string, data []byte, mode os.FileMode) error {
err := EnsureFileDir(path)
if err != nil {
return err
}
return ioutil.WriteFile(path, data, mode)
}
func CopyFile(srcPath, dstPath string) error {
srcFile, err := os.Open(srcPath)
if err != nil {
return err
}
defer func(srcFile *os.File) {
err := srcFile.Close()
if err != nil {
}
}(srcFile)
fileInfo, err := srcFile.Stat()
if err != nil {
return err
}
return CopyFileFromIO(srcFile, dstPath, fileInfo.Mode())
}
func CopyFileFromIO(src io.Reader, dstPath string, perm os.FileMode) error {
if err := EnsureFileDir(dstPath); err != nil {
return err
}
dstFile, err := os.OpenFile(dstPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, perm)
if err != nil {
return err
}
defer func(dstFile *os.File) {
err := dstFile.Close()
if err != nil {
}
}(dstFile)
_, err = io.Copy(dstFile, src)
return err
}
func CopyFileIfNotExist(srcPath, dstPath string) error {
if exist, err := FileExist(dstPath); err != nil {
return err
} else if !exist {
return CopyFile(srcPath, dstPath)
} else {
return nil
}
}