mirror of
https://github.com/IceWhaleTech/CasaOS.git
synced 2025-06-16 05:55:33 +00:00
Added CasaOS own file manager, now you can browse, upload, download files from the system, even edit code online, preview photos and videos through it. It will appear in the first position of Apps. Added CPU core count display and memory capacity display.
323 lines
6.0 KiB
Go
323 lines
6.0 KiB
Go
package file
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"mime/multipart"
|
|
"os"
|
|
"path"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// GetSize get the file size
|
|
func GetSize(f multipart.File) (int, error) {
|
|
content, err := ioutil.ReadAll(f)
|
|
return len(content), err
|
|
}
|
|
|
|
// GetExt get the file ext
|
|
func GetExt(fileName string) string {
|
|
return path.Ext(fileName)
|
|
}
|
|
|
|
// CheckNotExist check if the file exists
|
|
func CheckNotExist(src string) bool {
|
|
_, err := os.Stat(src)
|
|
|
|
return os.IsNotExist(err)
|
|
}
|
|
|
|
// CheckPermission check if the file has permission
|
|
func CheckPermission(src string) bool {
|
|
_, err := os.Stat(src)
|
|
|
|
return os.IsPermission(err)
|
|
}
|
|
|
|
// IsNotExistMkDir create a directory if it does not exist
|
|
func IsNotExistMkDir(src string) error {
|
|
if notExist := CheckNotExist(src); notExist == true {
|
|
if err := MkDir(src); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MkDir create a directory
|
|
func MkDir(src string) error {
|
|
err := os.MkdirAll(src, os.ModePerm)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
os.Chmod(src, 0777)
|
|
|
|
return nil
|
|
}
|
|
|
|
// RMDir remove a directory
|
|
func RMDir(src string) error {
|
|
err := os.RemoveAll(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
os.Remove(src)
|
|
return nil
|
|
}
|
|
|
|
// Open a file according to a specific mode
|
|
func Open(name string, flag int, perm os.FileMode) (*os.File, error) {
|
|
f, err := os.OpenFile(name, flag, perm)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return f, nil
|
|
}
|
|
|
|
// MustOpen maximize trying to open the file
|
|
func MustOpen(fileName, filePath string) (*os.File, error) {
|
|
//dir, err := os.Getwd()
|
|
//if err != nil {
|
|
// return nil, fmt.Errorf("os.Getwd err: %v", err)
|
|
//}
|
|
|
|
src := filePath
|
|
perm := CheckPermission(src)
|
|
if perm == true {
|
|
return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src)
|
|
}
|
|
|
|
err := IsNotExistMkDir(src)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err)
|
|
}
|
|
|
|
f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Fail to OpenFile :%v", err)
|
|
}
|
|
|
|
return f, nil
|
|
}
|
|
|
|
// 判断所给路径文件/文件夹是否存在
|
|
func Exists(path string) bool {
|
|
_, err := os.Stat(path) //os.Stat获取文件信息
|
|
if err != nil {
|
|
if os.IsExist(err) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// 判断所给路径是否为文件夹
|
|
func IsDir(path string) bool {
|
|
s, err := os.Stat(path)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return s.IsDir()
|
|
}
|
|
|
|
// 判断所给路径是否为文件
|
|
func IsFile(path string) bool {
|
|
return !IsDir(path)
|
|
}
|
|
|
|
func CreateFile(path string) error {
|
|
file, err := os.Create(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
return nil
|
|
}
|
|
|
|
func CreateFileAndWriteContent(path string, content string) error {
|
|
file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer file.Close()
|
|
write := bufio.NewWriter(file)
|
|
|
|
write.WriteString(content)
|
|
|
|
write.Flush()
|
|
return nil
|
|
}
|
|
|
|
// IsNotExistMkDir create a directory if it does not exist
|
|
func IsNotExistCreateFile(src string) error {
|
|
if notExist := CheckNotExist(src); notExist == true {
|
|
if err := CreateFile(src); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func ReadFullFile(path string) []byte {
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return []byte("")
|
|
}
|
|
defer file.Close()
|
|
content, err := ioutil.ReadAll(file)
|
|
if err != nil {
|
|
return []byte("")
|
|
}
|
|
return content
|
|
}
|
|
|
|
// File copies a single file from src to dst
|
|
func CopyFile(src, dst string) error {
|
|
var err error
|
|
var srcfd *os.File
|
|
var dstfd *os.File
|
|
var srcinfo os.FileInfo
|
|
|
|
lastPath := src[strings.LastIndex(src, "/")+1:]
|
|
|
|
if !strings.HasSuffix(dst, "/") {
|
|
dst += "/"
|
|
}
|
|
dstPath := dst
|
|
dst += lastPath
|
|
for i := 0; Exists(dst); i++ {
|
|
name := strings.Split(lastPath, ".")
|
|
nameIndex := 0
|
|
if len(name) > 2 {
|
|
nameIndex = len(name) - 2
|
|
}
|
|
name[nameIndex] = name[nameIndex] + strconv.Itoa(i+1)
|
|
dst = dstPath
|
|
for _, v := range name {
|
|
dst += v + "."
|
|
}
|
|
dst = strings.TrimSuffix(dst, ".")
|
|
}
|
|
|
|
if srcfd, err = os.Open(src); err != nil {
|
|
return err
|
|
}
|
|
defer srcfd.Close()
|
|
|
|
if dstfd, err = os.Create(dst); err != nil {
|
|
return err
|
|
}
|
|
defer dstfd.Close()
|
|
|
|
if _, err = io.Copy(dstfd, srcfd); err != nil {
|
|
return err
|
|
}
|
|
if srcinfo, err = os.Stat(src); err != nil {
|
|
return err
|
|
}
|
|
return os.Chmod(dst, srcinfo.Mode())
|
|
}
|
|
|
|
// Dir copies a whole directory recursively
|
|
func CopyDir(src string, dst string) error {
|
|
var err error
|
|
var fds []os.FileInfo
|
|
var srcinfo os.FileInfo
|
|
|
|
if srcinfo, err = os.Stat(src); err != nil {
|
|
return err
|
|
}
|
|
if !srcinfo.IsDir() {
|
|
if err = CopyFile(src, dst); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
return nil
|
|
}
|
|
dstPath := dst
|
|
lastPath := src[strings.LastIndex(src, "/")+1:]
|
|
dst += "/" + lastPath
|
|
for i := 0; Exists(dst); i++ {
|
|
dst = dstPath + "/" + lastPath + strconv.Itoa(i+1)
|
|
}
|
|
if err = os.MkdirAll(dst, srcinfo.Mode()); err != nil {
|
|
return err
|
|
}
|
|
if fds, err = ioutil.ReadDir(src); err != nil {
|
|
return err
|
|
}
|
|
for _, fd := range fds {
|
|
srcfp := path.Join(src, fd.Name())
|
|
dstfp := dst //path.Join(dst, fd.Name())
|
|
|
|
if fd.IsDir() {
|
|
if err = CopyDir(srcfp, dstfp); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
} else {
|
|
if err = CopyFile(srcfp, dstfp); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//文件写入临时目录
|
|
func WriteToPath(data []byte, path, name string) error {
|
|
fullPath := path
|
|
if strings.HasSuffix(path, "/") {
|
|
fullPath += name
|
|
} else {
|
|
fullPath += "/" + name
|
|
}
|
|
IsNotExistCreateFile(fullPath)
|
|
file, err := os.OpenFile(fullPath,
|
|
os.O_WRONLY|os.O_TRUNC|os.O_CREATE,
|
|
0666,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
_, err = file.Write(data)
|
|
|
|
return err
|
|
}
|
|
|
|
//最终拼接
|
|
func SpliceFiles(dir, path string, length int) error {
|
|
|
|
fullPath := path
|
|
|
|
IsNotExistCreateFile(fullPath)
|
|
|
|
file, _ := os.OpenFile(fullPath,
|
|
os.O_WRONLY|os.O_TRUNC|os.O_CREATE,
|
|
0666,
|
|
)
|
|
defer file.Close()
|
|
bufferedWriter := bufio.NewWriter(file)
|
|
for i := 0; i < length; i++ {
|
|
data, err := ioutil.ReadFile(path + strconv.Itoa(i))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = bufferedWriter.Write(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
bufferedWriter.Flush()
|
|
|
|
return nil
|
|
}
|