mirror of
https://github.com/SagerNet/sing.git
synced 2025-04-03 20:07:38 +03:00
110 lines
2 KiB
Go
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)
|
|
}
|