Go Path/filepath包使用

go路径分隔符

  • os.PathSeparator // 路径分隔符(分隔路径元素)
  • os.PathListSeparator // 路径列表分隔符(分隔多个路径)
  • 路径分割符号转换
    • ToSlash(path string) string //将 path 中平台相关的路径分隔符转换为 ‘/‘
    • FromSlash(path string) string // 将 path 中的 ‘/‘ 转换为系统相关的路径分隔符

filepath.Dir(path string) string

  • 获取 path 中最后一个分隔符之前的部分(不包含分隔符)

filepath.Base(path string) string

  • 获取 path 中最后一个分隔符之后的部分(不包含分隔符)

filepath.Split(path string) (dir, file string)

  • 获取 path 中最后一个分隔符前后的两部分
  • 之前包含分隔符,之后不包含分隔符

filepath.Ext(path string) string

  • 获取路径字符串中的文件扩展名

    实例代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    s := `http://www.site.com/a/b/c/d?a=aaa&b=bbb#ccc`

    u, _ := url.Parse(s)
    path := u.Path
    fmt.Println(path) // /a/b/c/d

    //filepath.Dir 获取 path 中最后一个分隔符之前的部分(不包含分隔符)
    fmt.Println(filepath.Dir(path)) // /a/b/c
    // 获取 path 中最后一个分隔符之后的部分(不包含分隔符)
    fmt.Println(filepath.Base(path)) // d
    // 获取 path 中最后一个分隔符前后的两部分
    // 之前包含分隔符,之后不包含分隔符
    fmt.Println(filepath.Split(path)) // /a/b/c/ d
    // 获取路径字符串中的文件扩展名
    fmt.Println(filepath.Ext("./a/b/c/index.php")) // .php

filepath.Rel(basepath, targpath string) (string, error)

  • 获取 targpath 相对于 basepath 的路径。
  • 要求 targpath 和 basepath 必须“都是相对路径”或“都是绝对路径”。

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
       // 都是绝对路径
    s, err := filepath.Rel(`/a/b/c`, `/a/b/c/d/e`)
    fmt.Println(s, err) // d/e <nil>

    // 都是相对路径
    s, err = filepath.Rel(`a/b/c`, `a/b/c/d/e`)
    fmt.Println(s, err) // d/e <nil>

    // 一个绝对一个相对
    s, err = filepath.Rel(`/a/b/c`, `a/b/c/d/e`)
    fmt.Println(s, err)
    // Rel: can't make a/b/c/d/e relative to /a/b/c

    // 一个相对一个绝对
    s, err = filepath.Rel(`a/b/c`, `/a/b/c/d/e`)
    fmt.Println(s, err)
    // Rel: can't make /a/b/c/d/e relative to a/b/c

    // 从 `a/b/c` 进入 `a/b/d/e`,只需要进入 `../d/e` 即可
    s, err = filepath.Rel(`a/b/c`, `a/b/d/e`)
    fmt.Println(s, err) // ../d/e <nil>

filepath.Join(elem …string) string

  • 将 elem 中的多个元素合并为一个路径,忽略空元素,清理多余字符。
    1
    2
    p := filepath.Join("/a/b","c","/d") //  目录加不加"/"都会自动处理
    fmt.Println(p) // /a/b/c/d

filepath.Clean(path string) string

  • 清理路径中的多余字符,比如 /// 或 ../ 或 ./
    1
    2
       s := filepath.Clean("a/./b/:::/..//  /c/..///d///")
    fmt.Println(s) // a/b/ /d

filepath.Abs(path string) (string, error)

  • 获取 path 的绝对路径
    1
    2
    3
    s1 := `a/b/c/d`
    fmt.Println(filepath.Abs(s1)) // 不同系统显示不一样 显示相对于当前路径的绝对路径地址

filepath.IsAbs(path string) bool

  • 判断路径是否为绝对路径
    1
    2
    3
    4
    s1 := `a/b/c/d`
    s2 := `/a/b/c/d`
    fmt.Println(filepath.IsAbs(s1)) // false
    fmt.Println(filepath.IsAbs(s2)) // true

filepath.SplitList(path string) []string

  • 将路径序列 path 分割为多条独立的路径
    1
    2
    3
    path := `a/b/c:d/e/f:   g/h/i`
    s := filepath.SplitList(path)
    fmt.Printf("%q", s) // ["a/b/c" "d/e/f" " g/h/i"]
  • 返回链接(快捷方式)所指向的实际文件
    1
    fmt.Println(filepath.EvalSymlinks("/Applications/XAMPP/htdocs"))   //   /Applications/XAMPP/xamppfiles/htdocs <nil>

filepath.Match(pattern, name string) (matched bool, err error)

  • 判断 name 是否和指定的模式 pattern 完全匹配
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    // []匹配范围内的任意一个字符 可以包含路径分隔符)
    fmt.Println(filepath.Match(`[aA][bB][cC]`, `aBc`)) // true
    // [^] 匹配范围外的任意一个字符 (无需包含路径分隔符)
    fmt.Println(filepath.Match(`[^aA]*`, `abc`)) // false
    // [] 之内可以使用 - 表示一个区间,比如 [a-z] 表示 a-z 之间的任意一个字符。
    fmt.Println(filepath.Match(`[a-z]*`, `a+b`)) // true
    // 反斜线用来匹配实际的字符,比如 \* 匹配 *,\[ 匹配 [,\a 匹配 a 等等。
    fmt.Println(filepath.Match(`\[*\]`, `[a+b]`)) // true
    // [] 之内可以直接使用 [ * ?,但不能直接使用 ] -,需要用 \]、\- 进行转义。
    fmt.Println(filepath.Match(`[[\]]*[[\]]`, `[]`)) // true
    fmt.Println(filepath.Match(`\[*\]`,`[aaa]`))
    fmt.Println(filepath.Match(`*\]`,`[]`))

filepath.Walk(root string, walkFn WalkFunc) error

  • 遍历指定目录(包括子目录),对遍历到的项目用 walkFn 函数进行处理。
  • 文件处理函数定义如下,如果 WalkFunc 返回 nil,则 Walk 函数继续
  • 遍历,如果返回 SkipDir,则 Walk 函数会跳过当前目录(如果当前遍
  • 历到的是文件,则同时跳过后续文件及子目录),继续遍历下一个目录。
  • 如果返回其它错误,则 Walk 函数会中止遍历过程。
  • 在 Walk 遍历过程中,如果遇到错误,则会将错误通过 err 传递给
  • WalkFunc 函数,同时 Walk 会跳过出错的项目,继续处理后续项目。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    err := filepath.Walk("./", findTxtDir)
    func findTxtDir(path string, info os.FileInfo, err error) error {
    ok, err := filepath.Match(`*.go`, info.Name())
    if ok {
    fmt.Println(filepath.Dir(path), info.Name())
    // 遇到 txt 文件则继续处理所在目录的下一个目录
    // 注意会跳过子目录
    return filepath.SkipDir
    }
    return err
    }