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)
}

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

(0)

相关推荐

  • 以alpine作为基础镜像构建Golang可执行程序操作

    Alpine介绍 Alpine 操作系统是一个面向安全的轻型 Linux 发行版.它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐.在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种

  • golang-redis之sorted set类型操作详解

    1:安装redigo go get github.com/garyburd/redigo/redis 2:引用redigo import ( "github.com/garyburd/redigo/redis" ) 3:连接Redis c, err := redis.Dial("tcp", "192.168.2.225:6379") if err != nil { fmt.Println("connect to redis err&qu

  • golang逐行读取文件的操作

    我就废话不多说了,大家还是直接看代码吧~ func ReadLine(fileName string) ([]string,error){ f, err := os.Open(fileName) if err != nil { return nil,err } buf := bufio.NewReader(f) var result []string for { line, err := buf.ReadString('\n') line = strings.TrimSpace(line) if

  • golang 字符串切片去重实例

    实现目的:实现字符串切片去重,只是两个字符完全相同时,去除一个. 实现方式:考虑两种,一种是常规的双重循环去除,另一种是利用map的key的唯一性实现. 1.通过双重循环来过滤重复元素 方法1, 思路:利用for双重循环,新建一个slice,遍历原slice中的每一个元素,每一次判断这个元素和后面元素是否相同,若相同则去除,若不同则存入新slice中,判断本元素后,再继续判断下一个元素,直到判断完毕. package main import "fmt" func main() { va

  • golang 64位linux环境下编译出32位程序操作

    目标:在64位linux系统上编译出32位程序. 操作: 1.执行 go env 查看当前go环境配置 2.执行 export GOARCH=386 配置go输出系统平台为32位 3.go build 编译程序 4.使用file main 指令查看编译出的可执行程序是否为32位 实践图片: 补充:golang float32/64与[]byte互转 网络协议开发中经常需要将int.float.bool等转为二进制数据,float32.64 与[]byte处理: import ( "encodin

  • golang 解析word文档操作

    baliance/gooxml gooxml是可以对整个office document提供支持的golang库,功能很强大,这里简单给出对word文档的读取案例 安装 go get baliance.com/gooxml/ go build -i baliance.com/gooxml/- 解析word代码 package main import ( "fmt" "log" "baliance.com/gooxml/document" ) fun

  • golang 如何获取pem格式RSA公私钥长度

    因在做license注册机制当中,有对根据本地RSA pem密钥文件判断出RSA的公私密钥长度的需求(即:根据pem内容判断出RSA密钥是1024位或者2048位,或者其他位数等),因此个人通过思考,摸索整理出一个方法,予以记录,备用,分享. package main import ( "crypto/rsa" "crypto/x509" "encoding/pem" "errors" "fmt" &quo

  • 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(p

  • golang中的net/rpc包使用概述(小结)

    RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 我的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,消耗的系统资源越来越多,于是乎就希望可以改成用rpc来做内部的通讯,对外依然用Restful.于是就想到了golang标准库的rpc包和google的grpc. 这篇文章重点了解一下golang的rpc包. 介绍 golang的rpc支持三个级别的RPC:TCP.HTTP.JSONR

  • Golang中的time.Duration类型用法说明

    在 Time 包中,定义有一个名为 Duration 的类型和一些辅助的常量: type Duration int64 const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute ) 那么我们看下面一段代码: func Test(

  • GoLang 中的随机数的示例代码

    随机数我们都知道,就是计算机通过某种算法,"随机"的生成一个数字.很多编程语言都有内置的方法来生成随机数,那么 GoLang 中是怎样一种情况呢? 伪随机数 我们都知道"随机数"在现实生活中的概念,可能你随手抛一个硬币,就可以说其结果是随机的,但是在计算机中要确定一个"随机数"真的是"随机数",那可是有标准的,不是你随随便便说是就是. 根据密码学原理,要想对一个"随机数"进行随机性检验有以下几个标准: 统计

  • 浅谈Golang中创建一个简单的服务器的方法

    我们知道,golang中的net/http包对网络的支持非常好,这样会让我们比较容易的建立起一个相对简单的服务器,我们来看一段代码 func sayHi(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w,"Hi") } func main() { http.HandleFunc("/sayHi", sayHi) log.Fatal(http.ListenAndServe("localhost:80

  • 深度剖析Golang中的数组,字符串和切片

    目录 1. 数组 1.1 定义数组 1.2 访问数组 1.3 修改数组 1.4 数组长度 1.5 遍历数组 1.6 多维数组 2. 切片 2.1 定义切片 2.2 访问切片元素 2.3 修改切片元素 2.4 切片长度和容量 2.5 向切片中添加元素 2.6 切片的切片 2.7 切片排序 3. 字符串 3.1 访问字符串中的字符 3.2 字符串切片 3.3 字符串操作 3.4 关于字符串的常见问题 4. 总结 1. 数组 数组是 Golang 中的一种基本数据类型,用于存储固定数量的同类型元素.在

  • 解决golang中container/list包中的坑

    golang中list包用法可以参看这篇文章 但是list包中大部分对于e *Element进行操作的元素都可能会导致程序崩溃,其根本原因是e是一个Element类型的指针,当然其也可能为nil,但是golang中list包中函数没有对其进行是否为nil的检查,变默认其非nil进行操作,所以这种情况下,便可能出现程序崩溃. 1.举个简单例子 Remove()函数 package main import ( "container/list" "fmt" ) func

  • GoLang中Json Tag用法实例总结

    目录 前言 Json中Tag用法汇总 官方 Marshal 函数说明 参考 总结 前言 GoLang中结构体的 JSON Tag 标识(英文名backquote或backtick,反引号 ` 符号包裹的部分内容)一直未明确看过完整规范和使用说明,存在模棱两可,系统整理如下: JSON Tag标签的完整语法,包含哪些选项 不同选项(输出名/-/omitempty/string)的作用及使用范围 特殊注意事项补充 Json中Tag用法汇总 JSON Tag标签格式为:json:"FieldName/

  • 一文详解Golang中net/http包的实现原理

    目录 前言 http包执行流程 http包源码分析 端口监听 请求解析 路由分配 响应处理 前言 Go语言自带的net/http包提供了HTTP客户端和服务端的实现,实现一个简单的http服务非常容易,其自带了一些列结构和方法来帮助开发者简化HTTP服务开发的相关流程,因此我们不需要依赖任何第三方组件就能构建并启动一个高并发的HTTP服务器,net/http包在编写web应用中有很重要的作用,这篇文章会学习如何用 net/http 自己编写实现一个 HTTP Server 并探究其实现原理,具体

  • Golang中反射的常见用法分享

    目录 根据类型做不同处理 标准库 json 中的示例 基本类型的反射 数组类型的反射 chan 反射 map 反射 迭代反射 map 对象 slice 反射 string 反射 interface/Pointer 反射 结构体的反射 遍历结构体字段 根据名称或索引获取结构体字段 修改结构体字段 结构体方法调用 是否实现接口 结构体的 tag 修改结构体未导字段 方法的反射 入参和返回值 通过反射调用方法 总结 在之前的两篇文章 <深入理解 go reflect - 反射基本原理>.<深入

随机推荐