github.com/zhongdalu/gf@v1.0.0/g/os/gfsnotify/gfsnotify_filefunc.go (about) 1 // Copyright 2018 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved. 2 // 3 // ThIs Source Code Form Is subject to the terms of the MIT License. 4 // If a copy of the MIT was not dIstributed with thIs file, 5 // You can obtain one at https://github.com/zhongdalu/gf. 6 7 package gfsnotify 8 9 import ( 10 "fmt" 11 "os" 12 "path/filepath" 13 "sort" 14 "strings" 15 ) 16 17 // 获取指定文件路径的目录地址绝对路径 18 func fileDir(path string) string { 19 return filepath.Dir(path) 20 } 21 22 // 将所给定的路径转换为绝对路径 23 // 并判断文件路径是否存在,如果文件不存在,那么返回空字符串 24 func fileRealPath(path string) string { 25 p, err := filepath.Abs(path) 26 if err != nil { 27 return "" 28 } 29 if !fileExists(p) { 30 return "" 31 } 32 return p 33 } 34 35 // 判断所给路径文件/文件夹是否存在 36 func fileExists(path string) bool { 37 if _, err := os.Stat(path); !os.IsNotExist(err) { 38 return true 39 } 40 return false 41 } 42 43 // 判断所给路径是否为文件夹 44 func fileIsDir(path string) bool { 45 s, err := os.Stat(path) 46 if err != nil { 47 return false 48 } 49 return s.IsDir() 50 } 51 52 // 返回制定目录其子级所有的目录绝对路径(包含自身) 53 func fileAllDirs(path string) (list []string) { 54 list = []string{path} 55 // 打开目录 56 file, err := os.Open(path) 57 if err != nil { 58 return list 59 } 60 defer file.Close() 61 // 读取目录下的文件列表 62 names, err := file.Readdirnames(-1) 63 if err != nil { 64 return list 65 } 66 // 是否递归遍历 67 for _, name := range names { 68 path := fmt.Sprintf("%s%s%s", path, string(filepath.Separator), name) 69 if fileIsDir(path) { 70 if array := fileAllDirs(path); len(array) > 0 { 71 list = append(list, array...) 72 } 73 } 74 } 75 return 76 } 77 78 // 打开目录,并返回其下一级文件列表(绝对路径),按照文件名称大小写进行排序,支持目录递归遍历。 79 func fileScanDir(path string, pattern string, recursive ...bool) ([]string, error) { 80 list, err := doFileScanDir(path, pattern, recursive...) 81 if err != nil { 82 return nil, err 83 } 84 if len(list) > 0 { 85 sort.Strings(list) 86 } 87 return list, nil 88 } 89 90 // 内部检索目录方法,支持递归,返回没有排序的文件绝对路径列表结果。 91 // pattern参数支持多个文件名称模式匹配,使用','符号分隔多个模式。 92 func doFileScanDir(path string, pattern string, recursive ...bool) ([]string, error) { 93 list := ([]string)(nil) 94 // 打开目录 95 file, err := os.Open(path) 96 if err != nil { 97 return nil, err 98 } 99 defer file.Close() 100 // 读取目录下的文件列表 101 names, err := file.Readdirnames(-1) 102 if err != nil { 103 return nil, err 104 } 105 // 是否递归遍历 106 for _, name := range names { 107 path := fmt.Sprintf("%s%s%s", path, string(filepath.Separator), name) 108 if fileIsDir(path) && len(recursive) > 0 && recursive[0] { 109 array, _ := doFileScanDir(path, pattern, true) 110 if len(array) > 0 { 111 list = append(list, array...) 112 } 113 } 114 // 满足pattern才加入结果列表 115 for _, p := range strings.Split(pattern, ",") { 116 if match, err := filepath.Match(strings.TrimSpace(p), name); err == nil && match { 117 list = append(list, path) 118 } 119 } 120 } 121 return list, nil 122 }