path/filepath path什么用( 二 )


有时,我们需要分割 PATH 或 GOPATH 之类的环境变量(这些路径被特定于 OS 的列表分隔符连接起来),filepath.SplitList 就是这个用途:
【path/filepath path什么用】func SplitList(path string) []string
注意,与 strings.Split 函数的不同之处是:对 “”,SplitList 返回[]string{},而 strings.Split 返回 []string{“”} 。SplitList 内部调用的是 strings.Split 。
规整化路径func Clean(path string) string
Clean 函数通过单纯的词法操作返回和 path 代表同一地址的最短路径 。
它会不断的依次应用如下的规则,直到不能再进行任何处理:

  1. 将连续的多个路径分隔符替换为单个路径分隔符
  2. 剔除每一个 . 路径名元素(代表当前目录)
  3. 剔除每一个路径内的 .. 路径名元素(代表父目录)和它前面的非 .. 路径名元素
  4. 剔除开始于根路径的 .. 路径名元素,即将路径开始处的 /.. 替换为 /(假设路径分隔符是 /)
返回的路径只有其代表一个根地址时才以路径分隔符结尾,如 Unix 的 / 或 Windows 的 C: 。
如果处理的结果是空字符串,Clean 会返回 .,代表当前路径 。
符号链接指向的路径名在上一节 os 包中介绍了 Readlink,可以读取符号链接指向的路径名 。不过,如果原路径中又包含符号链接,Readlink 却不会解析出来 。filepath.EvalSymlinks 会将所有路径的符号链接都解析出来 。除此之外,它返回的路径,是直接可访问的 。
func EvalSymlinks(path string) (string, error)
如果 path 或返回值是相对路径,则是相对于进程当前工作目录 。
os.Readlink 和 filepath.EvalSymlinks 区别示例程序:
// 在当前目录下创建一个 studygolang.txt 文件和一个 symlink 目录,在 symlink 目录下对 studygolang.txt 建一个符号链接 studygolang.txt.2fmt.Println(filepath.EvalSymlinks("symlink/studygolang.txt.2"))fmt.Println(os.Readlink("symlink/studygolang.txt.2"))// Ouput:// studygolang.txt // ../studygolang.txt
文件路径匹配func Match(pattern, name string) (matched bool, err error)
Match 指示 name 是否和 shell 的文件模式匹配 。模式语法如下:
pattern:{ term }term:'*'匹配 0 或多个非路径分隔符的字符'?'匹配 1 个非路径分隔符的字符'[' [ '^' ] { character-range } ']'字符组(必须非空)c匹配字符 c(c != '*', '?', '\', '[')'\' c匹配字符 ccharacter-range:c匹配字符 c(c != '\', '-', ']')'\' c匹配字符 clo '-' hi匹配区间[lo, hi]内的字符
匹配要求 pattern 必须和 name 全匹配上,不只是子串 。在 Windows 下转义字符被禁用 。
Match 函数很少使用,搜索了一遍,标准库没有用到这个函数 。而 Glob 函数在模板标准库中被用到了 。
func Glob(pattern string) (matches []string, err error)
Glob 函数返回所有匹配了 模式字符串 pattern 的文件列表或者 nil(如果没有匹配的文件) 。pattern 的语法和 Match 函数相同 。pattern 可以描述多层的名字,如 /usr/*/bin/ed(假设路径分隔符是 /) 。
注意,Glob 会忽略任何文件系统相关的错误,如读目录引发的 I/O 错误 。唯一的错误和 Match 一样,在 pattern 不合法时,返回 filepath.ErrBadPattern 。返回的结果是根据文件名字典顺序进行了排序的 。
Glob 的常见用法,是读取某个目录下所有的文件,比如写单元测试时,读取 testdata 目录下所有测试数据:
filepath.Glob("testdata/*.input")
遍历目录在介绍 os 时,讲解了读取目录的方法,并给出了一个遍历目录的示例 。在 filepath 中,提供了 Walk 函数,用于遍历目录树 。
func Walk(root string, walkFn WalkFunc) error
Walk 函数会遍历 root 指定的目录下的文件树,对每一个该文件树中的目录和文件都会调用 walkFn,包括 root 自身 。所有访问文件 / 目录时遇到的错误都会传递给 walkFn 过滤 。文件是按字典顺序遍历的,这让输出更漂亮,但也导致处理非常大的目录时效率会降低 。Walk 函数不会遍历文件树中的符号链接(快捷方式)文件包含的路径 。
walkFn 的类型 WalkFunc 的定义如下:
type WalkFunc func(path string, info os.FileInfo, err error) error
Walk 函数对每一个文件 / 目录都会调用 WalkFunc 函数类型值 。调用时 path 参数会包含 Walk 的 root 参数作为前缀;就是说,如果 Walk 函数的 root 为 “dir”,该目录下有文件 “a”,将会使用 “dir/a” 作为调用 walkFn 的参数 。walkFn 参数被调用时的 info 参数是 path 指定的地址(文件 / 目录)的文件信息,类型为 os.FileInfo 。
如果遍历 path 指定的文件或目录时出现了问题,传入的参数 err 会描述该问题,WalkFunc 类型函数可以决定如何去处理该错误(Walk 函数将不会深入该目录);如果该函数返回一个错误,Walk 函数的执行会中止;只有一个例外,如果 Walk 的 walkFn 返回值是 SkipDir,将会跳过该目录的内容而 Walk 函数照常执行处理下一个文件 。