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  }