mirror of
https://github.com/chrislusf/seaweedfs
synced 2024-09-07 01:20:37 +02:00
Previous implementation append filer logs into one file. So one file is not always sorted, which can lead to miss reading some entries, especially when different filers have different write throughput.
98 lines
1.7 KiB
Go
98 lines
1.7 KiB
Go
package util
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/chrislusf/seaweedfs/weed/glog"
|
|
)
|
|
|
|
func TestFolderWritable(folder string) (err error) {
|
|
fileInfo, err := os.Stat(folder)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !fileInfo.IsDir() {
|
|
return errors.New("Not a valid folder!")
|
|
}
|
|
perm := fileInfo.Mode().Perm()
|
|
glog.V(0).Infoln("Folder", folder, "Permission:", perm)
|
|
if 0200&perm != 0 {
|
|
return nil
|
|
}
|
|
return errors.New("Not writable!")
|
|
}
|
|
|
|
func GetFileSize(file *os.File) (size int64, err error) {
|
|
var fi os.FileInfo
|
|
if fi, err = file.Stat(); err == nil {
|
|
size = fi.Size()
|
|
}
|
|
return
|
|
}
|
|
|
|
func FileExists(filename string) bool {
|
|
|
|
_, err := os.Stat(filename)
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
return true
|
|
|
|
}
|
|
|
|
func CheckFile(filename string) (exists, canRead, canWrite bool, modTime time.Time, fileSize int64) {
|
|
exists = true
|
|
fi, err := os.Stat(filename)
|
|
if os.IsNotExist(err) {
|
|
exists = false
|
|
return
|
|
}
|
|
if err != nil {
|
|
glog.Errorf("check %s: %v", filename, err)
|
|
return
|
|
}
|
|
if fi.Mode()&0400 != 0 {
|
|
canRead = true
|
|
}
|
|
if fi.Mode()&0200 != 0 {
|
|
canWrite = true
|
|
}
|
|
modTime = fi.ModTime()
|
|
fileSize = fi.Size()
|
|
return
|
|
}
|
|
|
|
func ResolvePath(path string) string {
|
|
|
|
if !strings.Contains(path, "~") {
|
|
return path
|
|
}
|
|
|
|
usr, _ := user.Current()
|
|
dir := usr.HomeDir
|
|
|
|
if path == "~" {
|
|
// In case of "~", which won't be caught by the "else if"
|
|
path = dir
|
|
} else if strings.HasPrefix(path, "~/") {
|
|
// Use strings.HasPrefix so we don't match paths like
|
|
// "/something/~/something/"
|
|
path = filepath.Join(dir, path[2:])
|
|
}
|
|
|
|
return path
|
|
}
|
|
|
|
func FileNameBase(filename string) string {
|
|
lastDotIndex := strings.LastIndex(filename, ".")
|
|
if lastDotIndex < 0 {
|
|
return filename
|
|
}
|
|
return filename[:lastDotIndex]
|
|
}
|