mirror of
https://github.com/chaitin/SafeLine.git
synced 2026-02-01 14:23:25 +08:00
127 lines
2.3 KiB
Go
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
|
|
}
|
|
}
|