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 <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>
}
</nil></nil></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
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 · Go教程 | 4分钟前 |
- Golang并发测试与goroutine性能分析
- 456浏览 收藏
-
- Golang · Go教程 | 11分钟前 |
- Go语言scanner包:位移与空格识别解析
- 213浏览 收藏
-
- Golang · Go教程 | 13分钟前 |
- Golang适配器模式与接口转换技巧
- 371浏览 收藏
-
- Golang · Go教程 | 14分钟前 |
- Golang文件备份实现教程详解
- 105浏览 收藏
-
- Golang · Go教程 | 22分钟前 |
- Golang文件上传服务器搭建教程
- 125浏览 收藏
-
- Golang · Go教程 | 23分钟前 |
- Go语言自定义类型长度限制技巧
- 161浏览 收藏
-
- Golang · Go教程 | 25分钟前 |
- Golang反射实战教程详解
- 412浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- GolangCI/CD测试流程实现详解
- 347浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang模块冲突解决全攻略
- 200浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go语言处理JSON浮点数编码技巧
- 391浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golangselect多路复用实战教程详解
- 307浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3167次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3380次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3409次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4513次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3789次使用
-
- 解析Golang中的GoPath和GoModule
- 2022-12-28 296浏览
-
- Golangfilepath包常用函数详解
- 2023-02-25 103浏览

