------------------------------------------------------------

  filepath 中的函数会根据不同平台做不同的处理,比如路径分隔符、卷名等。

------------------------------------------------------------

路径分隔符转换:

const (
Separator = os.PathSeparator // 路径分隔符(分隔路径元素)
ListSeparator = os.PathListSeparator // 路径列表分隔符(分隔多个路径)
)   下面两个函数主要用于将 Windows 路径分隔符转换为 Linux 路径分隔符,处理完后再转换回去,只在 Windows 中有用,在 Linux 中没必要: // 将 path 中平台相关的路径分隔符转换为 '/'
ToSlash(path string) string
// 将 path 中的 '/' 转换为系统相关的路径分隔符
FromSlash(path string) string func main() {
s := `http://www.site.com/a/b/c/d`
u, _ := url.Parse(s)
s = u.Path
// 下面这句用于 Windows 系统
s = filepath.FromSlash(s)
fmt.Println(s) // /a/b/c/d 或 \a\b\c\d
// 创建目录试试
if err := os.MkdirAll(s[1:], 0777); err != nil {
fmt.Println(err)
}
// 下面这句用于 Windows 系统
s = filepath.ToSlash(s)
fmt.Println(s) // /a/b/c/d
} ------------------------------------------------------------ // 获取 path 中最后一个分隔符之前的部分(不包含分隔符)
Dir(path string) string
// 获取 path 中最后一个分隔符之后的部分(不包含分隔符)
Base(path string) string
// 获取 path 中最后一个分隔符前后的两部分
// 之前包含分隔符,之后不包含分隔符
Split(path string) (dir, file string)
// 获取路径字符串中的文件扩展名
Ext(path string) string func main() {
path := `a///b///c///d`
path = filepath.FromSlash(path) // 平台处理 d1 := filepath.Dir(path)
f1 := filepath.Base(path)
d2, f2 := filepath.Split(path)
fmt.Printf("%q %q\n%q %q\n", d1, f1, d2, f2)
// "a/b/c" "d"
// "a///b///c///" "d" ext := filepath.Ext(path)
fmt.Println(ext) // .txt
} ------------------------------------------------------------ // 获取 targpath 相对于 basepath 的路径。
// 要求 targpath 和 basepath 必须“都是相对路径”或“都是绝对路径”。
Rel(basepath, targpath string) (string, error) func main() {
// 都是绝对路径
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>
} ------------------------------------------------------------ // 将 elem 中的多个元素合并为一个路径,忽略空元素,清理多余字符。
Join(elem ...string) string func main() {
// Linux 示例
s := filepath.Join("a", "b", "", ":::", " ", `//c////d///`)
fmt.Println(s) // a/b/:::/ /c/d
} ------------------------------------------------------------ // 清理路径中的多余字符,比如 /// 或 ../ 或 ./
Clean(path string) string func main() {
// Linux 示例
s := filepath.Clean("a/./b/:::/..// /c/..///d///")
fmt.Println(s) // a/b/ /d
} ------------------------------------------------------------ // 获取 path 的绝对路径
Abs(path string) (string, error)
// 判断路径是否为绝对路径
IsAbs(path string) bool func main() {
s1 := `a/b/c/d`
fmt.Println(filepath.Abs(s1)) // 不同系统显示不一样
s2 := `/a/b/c/d`
fmt.Println(filepath.IsAbs(s1)) // false
fmt.Println(filepath.IsAbs(s2)) // true
} ------------------------------------------------------------ // 将路径序列 path 分割为多条独立的路径
SplitList(path string) []string func main() {
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"]
} ------------------------------------------------------------ // 返回路径字符串中的卷名
// Windows 中的 `C:\Windows` 会返回 "C:"
// Linux 中的 `//host/share/name` 会返回 `//host/share`
VolumeName(path string) string
// 返回链接(快捷方式)所指向的实际文件
EvalSymlinks(path string) (string, error) ------------------------------------------------------------ // 判断 name 是否和指定的模式 pattern 完全匹配
Match(pattern, name string) (matched bool, err error)
// pattern 规则如下:
// 可以使用 ? 匹配单个任意字符(不匹配路径分隔符)。
// 可以使用 * 匹配 0 个或多个任意字符(不匹配路径分隔符)。
// 可以使用 [] 匹配范围内的任意一个字符(可以包含路径分隔符)。
// 可以使用 [^] 匹配范围外的任意一个字符(无需包含路径分隔符)。
// [] 之内可以使用 - 表示一个区间,比如 [a-z] 表示 a-z 之间的任意一个字符。
// 反斜线用来匹配实际的字符,比如 \* 匹配 *,\[ 匹配 [,\a 匹配 a 等等。
// [] 之内可以直接使用 [ * ?,但不能直接使用 ] -,需要用 \]、\- 进行转义。 func main() {
fmt.Println(filepath.Match(`???`, `abc`)) // true
fmt.Println(filepath.Match(`???`, `abcd`)) // false
fmt.Println(filepath.Match(`*`, `abc`)) // true
fmt.Println(filepath.Match(`*`, ``)) // true
fmt.Println(filepath.Match(`a*`, `abc`)) // true
fmt.Println(filepath.Match(`???\\???`, `abc\def`)) // true
fmt.Println(filepath.Match(`???/???`, `abc/def`)) // true
fmt.Println(filepath.Match(`/*/*/*/`, `/a/b/c/`)) // true
fmt.Println(filepath.Match(`[aA][bB][cC]`, `aBc`)) // true
fmt.Println(filepath.Match(`[^aA]*`, `abc`)) // false
fmt.Println(filepath.Match(`[a-z]*`, `a+b`)) // true
fmt.Println(filepath.Match(`\[*\]`, `[a+b]`)) // true
fmt.Println(filepath.Match(`[[\]]*[[\]]`, `[]`)) // true
} ------------------------------------------------------------ // 列出与指定的模式 pattern 完全匹配的文件或目录(匹配原则同上)
Glob(pattern string) (matches []string, err error) func main() {
// 列出 usr 的子目录中所包含的以 ba(忽略大小写)开头的项目
list, err := filepath.Glob("/usr/*/[Bb][Aa]*")
if err != nil {
fmt.Println(err)
}
for _, v := range list {
fmt.Println(v)
}
} ------------------------------------------------------------ // 遍历指定目录(包括子目录),对遍历到的项目用 walkFn 函数进行处理。
Walk(root string, walkFn WalkFunc) error
// 文件处理函数定义如下,如果 WalkFunc 返回 nil,则 Walk 函数继续
// 遍历,如果返回 SkipDir,则 Walk 函数会跳过当前目录(如果当前遍
// 历到的是文件,则同时跳过后续文件及子目录),继续遍历下一个目录。
// 如果返回其它错误,则 Walk 函数会中止遍历过程。
// 在 Walk 遍历过程中,如果遇到错误,则会将错误通过 err 传递给
// WalkFunc 函数,同时 Walk 会跳过出错的项目,继续处理后续项目。
type WalkFunc func(path string, info os.FileInfo, err error) error // WalkFunc 函数:
// 列出含有 *.txt 文件的目录(不是全部,因为会跳过一些子目录)
func findTxtDir(path string, info os.FileInfo, err error) error {
ok, err := filepath.Match(`*.txt`, info.Name())
if ok {
fmt.Println(filepath.Dir(path), info.Name())
// 遇到 txt 文件则继续处理所在目录的下一个目录
// 注意会跳过子目录
return filepath.SkipDir
}
return err
} // WalkFunc 函数:
// 列出所有以 ab 开头的目录(全部,因为没有跳过任何项目)
func findabDir(path string, info os.FileInfo, err error) error {
if info.IsDir() {
ok, err := filepath.Match(`[aA][bB]*`, info.Name())
if err != nil {
return err
}
if ok {
fmt.Println(path)
}
}
return nil
} func main() {
// 列出含有 *.txt 文件的目录(不是全部,因为会跳过一些子目录)
err := filepath.Walk(`/usr`, findTxtDir)
fmt.Println(err) fmt.Println("==============================") // 列出所有以 ab 开头的目录(全部,因为没有跳过任何项目)
err = filepath.Walk(`/usr`, findabDir)
fmt.Println(err)
} ------------------------------------------------------------ 在 path 包中有一些同名的函数,但它们只处理 Linux 路径分隔符 '/'。

Golang学习 - path/filepath 包的更多相关文章

  1. go标准库的学习-path/filepath

    参考https://studygolang.com/pkgdoc 标准库path中有的该path/filepath库中都有,所以一般都使用path/filepath 导入方式: import &quo ...

  2. Go path/filepath包

    path/filepath 标准库path中有的功能filepath全部具备, 所以使用filepath即可. isABS() 判断一个路径是不是绝对路径. package main import ( ...

  3. Golang学习笔记:包制作

    golang的包跟java as js之类的大不一样,一定要存在GOPATH里面,GOPATH是专门用于存放golang第三方的库,里面有两个文件夹, src:源代码目录 pkg:编译后的第三方包,这 ...

  4. Golang学习 - io/ioutil 包

    ------------------------------------------------------------ // Discard 是一个 io.Writer 接口,调用它的 Write ...

  5. Golang学习 - unicode/utf16 包

    ------------------------------------------------------------ // IsSurrogate 判断 r 是否为代理区字符 // 两个代理区字符 ...

  6. Golang学习 - unicode/utf8 包

    ------------------------------------------------------------ // 编码所需的基本数字 const ( RuneError = '\uFFF ...

  7. Golang学习 - errors 包

    ------------------------------------------------------------ Go 语言使用 error 类型来返回函数执行过程中遇到的错误,如果返回的 e ...

  8. Go path/filepath文件路径操作

    本文:https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter06/06.2.html path:htt ...

  9. go语言path包和filepath包的学习与使用

    path包的使用 package main; import ( "fmt" "path" ) //go语言path包的学习 func main() { //返回 ...

随机推荐

  1. 项目 erlang启动时死循环

    机子里的otp是新装的 看了一下main 是在util:ensure_started一堆app的时候死讯了, 按照顺序是sasl crypto asn1 public_key ssl 发现是publi ...

  2. ets dets

    相同点:ets和dets都提供“键—值”搜索表 不同点:ets驻留在内存,dets驻留在磁盘 特点:ets表和dets表可以被多个进程共享,因此通过这两个模块可以实现数据间的交换 一  ets表 实现 ...

  3. MapReduce运行时出现java.lang.NoClassDefFoundError

    最近在编写MapReduce程序时遇到了一个错误,错误提示信息为: Error: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.H ...

  4. RVM 安装&下载Ruby

    1. #查看当前ruby版本 2. $ ruby -v 3. ruby 1.8.7 4. #列出已知的ruby版本 5. $ rvm list known 6. #安装ruby 1.9.3 7. $ ...

  5. hdu 1576 A/B (扩展欧几里德简单运用)

    http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others) Memory Lim ...

  6. 成功获取并更改中兴F660光猫的超级用户密码解除四台限制

    上次雷雨后更换的中兴的F660光猫还是很不错的,很稳定,不过超级密码确实记不住,找了些资料,今天成功的更改了密码,简要的写出过程以备下次参考: 第一步:获取超级密码(已知用户名telecomadmin ...

  7. 使用timer8秒读取一次方法进行操作

    public void TestofTimer() { System.Timers.Timer tt = new System.Timers.Timer(); //获取或设置引发 Elapsed 事件 ...

  8. HDU 2196Computer(树形DP)

    给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 比较典型的题了,主要方法是进行两次DFS,第一次DFS求出每一个点距离它的子树的最远距离和次远距离,然后第二次DFS从父节点传过来另一侧的 ...

  9. How Tomcat Works(七)

    本文接下来介绍并分析servlet容器,servlet容器是用来处理请求servlet资源,并为web客户端填充response对象的模块. servlet容器是org.apache.catalina ...

  10. halcon,C# 学习

    Halcon学习之一:查询图像参数 1.get_grayval ( Image : : Row, Column : Grayval ) 计算Image图像中坐标为(Row,Column)的点的灰度值G ...