sing/common/rw/file.go
2024-06-24 09:42:23 +08:00

110 lines
2 KiB
Go

package rw
import (
"encoding/json"
"io"
"os"
"strings"
"github.com/sagernet/sing/common"
)
func IsFile(path string) bool {
stat, err := os.Stat(path)
if err != nil {
return false
}
return !stat.IsDir()
}
func IsDir(path string) bool {
stat, err := os.Stat(path)
if err != nil {
return false
}
return stat.IsDir()
}
func MkdirParent(path string) error {
if strings.Contains(path, string(os.PathSeparator)) {
parent := path[:strings.LastIndex(path, string(os.PathSeparator))]
if !IsDir(parent) {
err := os.MkdirAll(parent, 0o755)
if err != nil {
return err
}
}
}
return nil
}
func CopyFile(srcPath, dstPath string) error {
srcFile, err := os.Open(srcPath)
if err != nil {
return err
}
defer srcFile.Close()
srcStat, err := srcFile.Stat()
if err != nil {
return err
}
err = MkdirParent(dstPath)
if err != nil {
return err
}
dstFile, err := os.OpenFile(dstPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcStat.Mode())
if err != nil {
return err
}
defer dstFile.Close()
_, err = io.Copy(dstFile, srcFile)
return err
}
// Deprecated: use IsFile and IsDir instead.
func FileExists(path string) bool {
return common.Error(os.Stat(path)) == nil
}
// Deprecated: use MkdirParent and os.WriteFile instead.
func WriteFile(path string, content []byte) error {
if strings.Contains(path, "/") {
parent := path[:strings.LastIndex(path, "/")]
if !FileExists(parent) {
err := os.MkdirAll(parent, 0o755)
if err != nil {
return err
}
}
}
file, err := os.Create(path)
if err != nil {
return err
}
defer file.Close()
_, err = file.Write(content)
return err
}
// Deprecated: wtf is this?
func ReadJSON(path string, data any) error {
content, err := os.ReadFile(path)
if err != nil {
return err
}
err = json.Unmarshal(content, data)
if err != nil {
return err
}
return nil
}
// Deprecated: wtf is this?
func WriteJSON(path string, data any) error {
content, err := json.Marshal(data)
if err != nil {
return err
}
return WriteFile(path, content)
}