123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package files
- import (
- "fmt"
- "os"
- "path/filepath"
- "sort"
- "strings"
- )
- // 按文件名排序,可扩展至文件时间
- type byName []os.FileInfo
- //func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() } // 文件名升序,默认方式
- func (f byName) Less(i, j int) bool { return f[i].Name() > f[j].Name() } // 文件名倒序
- func (f byName) Len() int { return len(f) }
- func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
- // GetFileListBySuffix returns an ordered list of file paths.
- // It recognize if given path is a file, and don't do recursive find.
- func GetFileListBySuffix(dirPath, suffix string, needDir bool, isDescend bool, num int) ([]string, error) {
- if !IsExist(dirPath) {
- return nil, fmt.Errorf("given path does not exist: %s", dirPath)
- } else if IsFile(dirPath) {
- return []string{dirPath}, nil
- }
- // Given path is a directory.
- dir, err := os.Open(dirPath)
- if err != nil {
- return nil, err
- }
- fis, err := dir.Readdir(0)
- if err != nil {
- return nil, err
- }
- if isDescend {
- sort.Sort(byName(fis))
- }
- if num == 0 {
- num = len(fis)
- }
- files := make([]string, 0, num)
- for i := 0; i < num; i++ {
- fi := fis[i]
- if strings.HasSuffix(fi.Name(), suffix) {
- if needDir {
- files = append(files, filepath.Join(dirPath, fi.Name()))
- } else {
- files = append(files, fi.Name())
- }
- }
- }
- return files, nil
- }
- // as GetFileListBySuffix, but for Prefix
- func GetFileListByPrefix(dirPath, suffix string, needDir bool, isDescend bool, num int) ([]string, error) {
- if !IsExist(dirPath) {
- return nil, fmt.Errorf("given path does not exist: %s", dirPath)
- } else if IsFile(dirPath) {
- return []string{dirPath}, nil
- }
- // Given path is a directory.
- dir, err := os.Open(dirPath)
- if err != nil {
- return nil, err
- }
- fis, err := dir.Readdir(0)
- if err != nil {
- return nil, err
- }
- if isDescend {
- sort.Sort(byName(fis))
- }
- if num == 0 {
- num = len(fis)
- }
- files := make([]string, 0, num)
- for i := 0; i < num; i++ {
- fi := fis[i]
- if strings.HasPrefix(fi.Name(), suffix) {
- if needDir {
- files = append(files, filepath.Join(dirPath, fi.Name()))
- } else {
- files = append(files, fi.Name())
- }
- }
- }
- return files, nil
- }
- // 根据关键字查找
- func GetFileListByKey(dirPath, key string, needDir bool, isDescend bool, num int) ([]string, error) {
- if !IsExist(dirPath) {
- return nil, fmt.Errorf("given path does not exist: %s", dirPath)
- } else if IsFile(dirPath) {
- return []string{dirPath}, nil
- }
- // Given path is a directory.
- dir, err := os.Open(dirPath)
- if err != nil {
- return nil, err
- }
- fis, err := dir.Readdir(0)
- if err != nil {
- return nil, err
- }
- if isDescend {
- sort.Sort(byName(fis))
- }
- if num == 0 {
- num = len(fis)
- }
- files := make([]string, 0, num)
- for i := 0; i < num; i++ {
- fi := fis[i]
- if strings.Contains(fi.Name(), key) {
- if needDir {
- files = append(files, filepath.Join(dirPath, fi.Name()))
- } else {
- files = append(files, fi.Name())
- }
- }
- }
- return files, nil
- }
- 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 IsExist(path string) bool {
- _, err := os.Stat(path)
- if err != nil {
- if os.IsExist(err) {
- return true
- }
- return false
- }
- return true
- }
|