package files import ( "bufio" "fmt" "io" "net/http" "os" "os/user" "path/filepath" "strconv" "strings" ) func IsSymlink(mode os.FileMode) bool { return mode&os.ModeSymlink != 0 } func IsBlockDevice(mode os.FileMode) bool { return mode&os.ModeDevice != 0 && mode&os.ModeCharDevice == 0 } func GetMimeType(path string) string { file, err := os.Open(path) if err != nil { return "" } defer file.Close() buffer := make([]byte, 512) _, err = file.Read(buffer) if err != nil { return "" } mimeType := http.DetectContentType(buffer) return mimeType } func GetSymlink(path string) string { linkPath, err := os.Readlink(path) if err != nil { return "" } return linkPath } func GetUsername(uid uint32) string { usr, err := user.LookupId(strconv.Itoa(int(uid))) if err != nil { return "" } return usr.Username } func GetGroup(gid uint32) string { usr, err := user.LookupGroupId(strconv.Itoa(int(gid))) if err != nil { return "" } return usr.Name } const dotCharacter = 46 func IsHidden(path string) bool { return path[0] == dotCharacter } func ReadFileByLine(filename string, page, pageSize int) ([]string, bool, error) { if !NewFileOp().Stat(filename) { return nil, true, nil } file, err := os.Open(filename) if err != nil { return nil, false, err } defer file.Close() reader := bufio.NewReaderSize(file, 8192) var lines []string currentLine := 0 startLine := (page - 1) * pageSize endLine := startLine + pageSize for { line, _, err := reader.ReadLine() if err == io.EOF { break } if currentLine >= startLine && currentLine < endLine { lines = append(lines, string(line)) } currentLine++ if currentLine >= endLine { break } } isEndOfFile := currentLine < endLine return lines, isEndOfFile, nil } func GetParentMode(path string) (os.FileMode, error) { absPath, err := filepath.Abs(path) if err != nil { return 0, err } for { fileInfo, err := os.Stat(absPath) if err == nil { return fileInfo.Mode() & os.ModePerm, nil } if !os.IsNotExist(err) { return 0, err } parentDir := filepath.Dir(absPath) if parentDir == absPath { return 0, fmt.Errorf("no existing directory found in the path: %s", path) } absPath = parentDir } } func IsInvalidChar(name string) bool { return strings.Contains(name, "&") } func IsEmptyDir(dir string) bool { f, err := os.Open(dir) if err != nil { return false } defer f.Close() _, err = f.Readdirnames(1) return err == io.EOF }