Golang中的path/filepath包用法
在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Golang中的path/filepath包用法》,聊聊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
// 都是相对路径
s, err = filepath.Rel(`a/b/c`, `a/b/c/d/e`)
fmt.Println(s, err) // d/e
// 一个绝对一个相对
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
}
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
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)
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。
今天带大家了解了Path、filepath的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
golang逐行读取文件的操作
- 上一篇
- golang逐行读取文件的操作
- 下一篇
- 以alpine作为基础镜像构建Golang可执行程序操作
-
- 体贴的白开水
- 这篇文章内容出现的刚刚好,细节满满,赞 ??,已收藏,关注师傅了!希望师傅能多写Golang相关的文章。
- 2023-01-24 02:01:33
-
- 简单的斑马
- 好细啊,码住,感谢作者的这篇博文,我会继续支持!
- 2023-01-20 09:29:42
-
- 无奈的钥匙
- 这篇文章真及时,作者大大加油!
- 2023-01-17 13:41:56
-
- 甜甜的小鸽子
- 很棒,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢up主分享技术文章!
- 2023-01-16 09:18:58
-
- 甜美的斑马
- 这篇技术文章太及时了,太细致了,太给力了,码住,关注楼主了!希望楼主能多写Golang相关的文章。
- 2023-01-07 17:06:44
-
- Golang · Go教程 | 5小时前 | go · Go 交叉编译 GOARCH GOOS CGO_ENABLED
- Go 交叉编译怎样关闭 CGO
- 487浏览 收藏
-
- Golang · Go教程 | 6小时前 | go · Go教程 · go.work Go Modules go work 多模块联调
- Go work 怎样管理多个模块联调
- 245浏览 收藏
-
- Golang · Go教程 | 6小时前 | Go教程 · Go 模块依赖 Go Modules go mod why 依赖路径
- Go mod why 怎样解释模块引入路径
- 394浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Go net/url 怎样只修改查询参数而保留路径
- 274浏览 收藏
-
- Golang · Go教程 | 6小时前 | goroutine · go ·
- Go trace 怎样观察 goroutine 调度
- 351浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Go pprof 怎样定位 CPU 热点函数
- 321浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Go benchmark 怎样排除初始化耗时
- 266浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 585次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 622次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 655次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 622次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 436次使用
-
- 解析Golang中的GoPath和GoModule
- 2022-12-28 296浏览
-
- Golangfilepath包常用函数详解
- 2023-02-25 103浏览
-
- Go 怎么按通配符查找文件并处理无匹配结果
- 2026-09-06 429浏览
-
- Go 怎么解析符号链接得到实际文件路径
- 2026-09-06 381浏览
-
- Go filepath.WalkDir 怎么在遇到符号链接时保持不跟随
- 2026-09-08 127浏览

