Golang中的path/filepath包用法

 更新时间:2020年12月22日 10:06:29   作者:思维的深度  
这篇文章主要介绍了Golang中的path/filepath包用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

path/filepath包下的相关函数

1. ToSlash函数

func ToSlash(path string) string

功能:将path中平台相关的路径分隔符转换成'/'

例如:windows当前路径: D:\gopro\src\study,转换之后D:/gopro/src/study

2. FromSlash函数

func FromSlash(path string) string

功能:将 path 中的 '/' 转换为系统相关的路径分隔符

3.Dir函数

func Dir(path string) string

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

4.Base函数

func Base(path string) string

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

5.Split函数

func Split(path string) (dir, file string)

功能:获取path中最后一个分隔符前后的两部分,

dir是分隔符前面的部分包含分隔符,file是分隔符后面的部分不包含分隔符

6. Ext函数

func Ext(path string) string

功能:获取路径字符串中的文件扩展名

例如:

fmt.Println(“D:/gopro/src/aaa.txt”)

//如果该文件存在则会输出: .txt

7.Rel函数

func Rel(basepath, targpath string) (string, error)

功能:

获取targpath相对于basepath的路径

要求targpaht和basepath必须"都是相对路径"或都是"绝对路径"

例如:

package main 
import (
  "fmt"
  "path/filepath"
) 
 
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>
}

8.Join函数

func Join(elem ...string) string

功能:将elem中的多个元素合并成一个路径,忽略空元素,清理多余字符

9.Clean函数

func Clean(path string) string

功能:

清除path中多余的字符

规则如下:

1.如果有多个分隔符,则只留一个

2.消除每一个.(当前路径)路径名

3.消除每一个..(父目录)路径名,以及它之前的非..元素

2和3使用于linux系统

10. IsAbs函数

func IsAbs(path string) (b bool)

功能:判断该路径是否是绝对路径

11. Abs函数

func Abs(path string) (string, error)

功能:获取path的绝对路径

示例:

fmt.Println(filepath.Abs("b/c")) //返回结果:D:\gopro\src\study\b\c <nil>

12. SplitList函数

func SplitList(path string) []string

功能:按os.PathListSeparator即(;)将路径进行分割

13. VolumeName函数

func VolumeName(path string) string

功能:

返回路径字符串中的卷名

如Windows 中的 `C:\Windows` 会返回 "C:"

14. EvalSymlinks函数

func EvalSymlinks(path string) (string, error)

功能:返回链接(快捷方式)所指向的实际文件

15.Match函数

func Match(pattern, name string) (matched bool, err error)

功能:

根据pattern来判断name是否匹配,如果匹配则返回true

pattern 规则如下:

可以使用 ? 匹配单个任意字符(不匹配路径分隔符)。

可以使用 * 匹配 0 个或多个任意字符(不匹配路径分隔符)。

可以使用 [] 匹配范围内的任意一个字符(可以包含路径分隔符)。

可以使用 [^] 匹配范围外的任意一个字符(无需包含路径分隔符)。

[] 之内可以使用 - 表示一个区间,比如 [a-z] 表示 a-z 之间的任意一个字符。

反斜线用来匹配实际的字符,比如 \* 匹配 *,\[ 匹配 [,\a 匹配 a 等等。

[] 之内可以直接使用 [ * ?,但不能直接使用 ] -,需要用 \]、\- 进行转义。

16.Glob函数

func Glob(pattern string) (matches []string, err error)

功能:列出与指定的模式 pattern 完全匹配的文件或目录(匹配原则同上)

示例:

package main 
import (
 "os"
 "fmt"
 "path/filepath"
) 
 
func main() {
  pwd,_ := os.Getwd()
  fmt.Println(filepath.Glob(pwd+"/???"))
}

以上示例是列出当前文件夹下 名字为3个字符的文件或目录

17.Walk函数

func Walk(root string, walkFn WalkFunc) error

功能:遍历指定目录(包括子目录),对遍历的项目用walkFn函数进行处理

walkFn函数如下:

type WalkFunc func(path string, info os.FileInfo, err error) error

path为当前文件或目录的路径,info为文件描述信息

规则如下:

文件处理函数定义如下,如果 WalkFunc 返回 nil,则 Walk 函数继续遍历,如果返回 SkipDir,则 Walk 函数会跳过当前目录(如果当前遍历到的是文件,则同时跳过后续文件及子目录),继续遍历下一个目录。如果返回其它错误,则 Walk 函数会中止遍历。在 Walk 遍历过程中,如果遇到错误,则会将错误通过 err 传递给WalkFunc 函数,同时 Walk 会跳过出错的项目,继续处理后续项目。

示例:

package main 
import (
  "os"
  "fmt"
  "path/filepath" 
)
 
func main() {
  pwd,_ := os.Getwd()
  filepath.Walk(pwd,func(fpath string, info os.FileInfo, err error) error {
    if match,err := filepath.Match("???",filepath.Base(fpath)); match {
      fmt.Println("path:",fpath)
      fmt.Println("info:",info)
      return err
    }
    return nil
  })
}

以上示例是遍历当前文件夹下名字为3个字符的文件或目录及info信息,及满足条件目录下的子文件或子目录。

path目录下的相关函数

1. Join函数

func Join(elem ...string) string

功能:将多个path进行连接

2. Match函数

func Match(pattern, name string) (matched bool, err error)

功能:根据pattern进行匹配

3. IsAbs函数

func IsAbs(path string) bool

功能:是否是绝对路径,判断是否是以'/'结尾,不适用windows

4.Clean函数

func Clean(path string) string

功能:清除path中多余的字符

5.Ext函数

func Ext(path string) string

功能:获取文件后缀名

6.Split函数

func Split(path string) (dir, file string)

功能:获取path中最后一个分隔符前后的两部分,分隔符前面的部分包含分隔符,后面的不包含分割符

7. Base函数

func Base(path string) string

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

8.Dir函数

func Dir(path string) string

功能:获取path的目录,最后一个分隔符前面的内容

补充:golang中io/ioutil.readdir和path/filepath.walk遍历获取目录下文件性能比较

在使用golang进行开发,获取当前目录下文件或文件列表时候有两种库方法可以供使用。但是那种性能好,在网上没有找到详细的描述,因此自己写了两个函数,进行了下比较。最终发现ioutil的效率要高很高。

具体执行效果,获取一个D盘目录下总共340个文件,比较两个函数耗时明显发现 ioutil的效率要高很多:

下面就贴出源代码,大家在这块有更高效的处理,欢迎讨论:

package main 
import (
 "fmt"
 "io/ioutil"
 "os"
 "path/filepath"
 "time"
) 
 
func GetAllFile(pathname string, s []string) ([]string, error) {
 fromSlash := filepath.FromSlash(pathname)
 //fmt.Println(fromSlash)
 rd, err := ioutil.ReadDir(fromSlash)
 if err != nil {
 //log.LOGGER("Error").Error("read dir fail %v\n", err)
 fmt.Println("read dir fail:", err)
 return s, err
 }
 for _, fi := range rd {
 if fi.IsDir() {
 fullDir:= filepath.Join(fromSlash,fi.Name())
 s, err = GetAllFile(fullDir, s)
 if err != nil {
 fmt.Println("read dir fail:", err)
 //log.LOGGER("Error").Error("read dir fail: %v\n", err)
 return s, err
 }
 } else {
 fullName:= filepath.Join(fromSlash,fi.Name())
 s = append(s, fullName)
 }
 }
 return s, nil
}
 
func GetALLFIles_walk(pathname string)([]string){
 StartTime :=time.Now();
 dst_target :=[]string{}
 err := filepath.Walk(pathname, func(src string, f os.FileInfo, err error) error {
 if f == nil {
 return err
 }
 if f.IsDir(){
 return nil
 }else { //进行文件的复制
 dst_target=append(dst_target,src)
 
 //return s
 }
 //println(path)
 return nil
 })
 
 if err != nil {
 fmt.Printf("filepath.Walk() returned %v\n", err)
 return nil
 //log.LOGGER("Error").Error("filepath.Walk() returned %v\n", err)
 }
 fmt.Println("Cost Time:",time.Since(StartTime))
 return dst_target
}
 
func main(){ 
 s:=[]string{}
 n:=[]string{}
 pathname:="D://go_copysrc"
 
 fmt.Printf("filepath walk cost time returned \n")
 n = GetALLFIles_walk(pathname)
 fmt.Println("the number of file is %v,content is:%v",len(n),n)
 
 fmt.Printf("io util cost time returned \n")
 StartTime :=time.Now();
 s,_=GetAllFile(pathname,s)
 fmt.Println("Cost Time:",time.Since(StartTime))
 fmt.Println("the number of file is %v,content is:%v",len(s),s) 
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Go语言Mock使用基本指南详解

    Go语言Mock使用基本指南详解

    这篇文章主要介绍了Go语言Mock使用基本指南详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 基于golang如何实现error工具包详解

    基于golang如何实现error工具包详解

    Go 语言使用 error 类型来返回函数执行过程中遇到的错误,下面这篇文章主要给大家介绍了关于如何基于golang实现error工具包的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • 使用go在mangodb中进行CRUD操作

    使用go在mangodb中进行CRUD操作

    这篇文章主要介绍了使用go在mangodb中进行CRUD操作,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • golang gin 框架 异步同步 goroutine 并发操作

    golang gin 框架 异步同步 goroutine 并发操作

    这篇文章主要介绍了golang gin 框架 异步同步 goroutine 并发操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GOLANG版的冒泡排序和快速排序分享

    GOLANG版的冒泡排序和快速排序分享

    这篇文章主要介绍了GOLANG版的冒泡排序和快速排序分享,需要的朋友可以参考下
    2015-03-03
  • 关于go语言载入json可能遇到的一个坑

    关于go语言载入json可能遇到的一个坑

    Go 语言从新手到大神,每个人多少都会踩一些坑,那么下面这篇文章主要给大家介绍了关于go语言载入json可能遇到的一个坑,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • Go语言的Windows下环境配置以及简单的程序结构讲解

    Go语言的Windows下环境配置以及简单的程序结构讲解

    这篇文章主要介绍了Go语言的Windows下环境配置以及简单的程序结构讲解,从编程语言约定俗成的hellow world开始,需要的朋友可以参考下
    2015-10-10
  • 浅谈Go中数字转换字符串的正确姿势

    浅谈Go中数字转换字符串的正确姿势

    这篇文章主要介绍了浅谈Go中数字转换字符串的正确姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • golang gorm中格式化时间问题详解

    golang gorm中格式化时间问题详解

    这篇文章主要给大家介绍了关于golang gorm中格式化时间问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Golang算法之田忌赛马问题实现方法分析

    Golang算法之田忌赛马问题实现方法分析

    这篇文章主要介绍了Golang算法之田忌赛马问题实现方法,结合具体实例形式分析了基于Go语言的田忌赛马问题原理与算法实现技巧,需要的朋友可以参考下
    2017-02-02

最新评论