golang标准库path/filepath使用示例


文章目录


前言

path/filepath包是一个非常重要的工具包,它提供了一系列函数用于操作和处理文件路径。在实际运维工具开发中肯定会涉及构建文件路径、解析路径中的各个部分、还是遍历目录树、读取文件等操作,path/filepath包都提供了便捷的方法来实现这些功能。
参考文档: https://pkg.go.dev/path/filepath


一、常用方法示例

1.将相对路径转换为绝对路径

代码如下(示例):

go 复制代码
func Abs(path string) (string, error)
使用Abs方法实现,接收一个string类型参数返回string类型和错误

package main

import (
        "fmt"
        "path/filepath"
)

func main() {
    	//相对路径
        relativePath := "./graylog/docker-compose.yml"
        absolutePath, err := filepath.Abs(relativePath)
        if err != nil {
                fmt.Println("Error:", err)
        }
    	//绝对路径
        fmt.Println("Absolute Path:", absolutePath)
}

2.获取路径中最后一个元素

代码如下(示例):

go 复制代码
// func Base(path string) string
// 如果路径为空字符串,Base返回.
// 相当于获取目录下的子文件或子目录
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	relativePath := "/var/log/message"
	absolutePath := filepath.Base(relativePath)
	fmt.Println("Absolute Path:", absolutePath)
}

3.获取路径中除去最后一个元素的部分

代码如下(示例):

go 复制代码
// func Dir(path string) string
// Dir函数返回路径中除去最后一个元素的部分,即路径的目录部分。如果路径为空字符串,Dir返回.
// 相当于获取某个文件或目录的父级目录
package main

import (
        "fmt"
        "path/filepath"
)

func main() {
        relativePath := "/export/graylog/es_data"
        absolutePath := filepath.Dir(relativePath)
        fmt.Println("Absolute Path:", absolutePath)
}

4.路径拼接

代码如下(示例):

go 复制代码
func Join(elem ...string) string
// 将任意数量的路径元素连接成一个单一路径,并根据需要添加斜杠

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	path1 := "/export/graylog"
	path2 := "es_data"
	fullPath := filepath.Join(path1, path2)
	fmt.Println("Full Path:", fullPath)
}

5.将路径拆分为目录和文件名两部分

代码如下(示例):

go 复制代码
func Split(path string) (dir, file string)

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	path := "/export/graylog/docker-compose.yml"
	dir, file := filepath.Split(path)
	fmt.Println("Directory:", dir)
	fmt.Println("File:", file)
}

6.返回一个相对路径

代码如下(示例):

go 复制代码
func Rel(basepath, targpath string) (string, error)
// 将base目录作为起点,目标目录作为终点

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	basepath := "/export"
	targpath := "/export/graylog/docker-compose.yml"
	relativePath, err := filepath.Rel(basepath, targpath)
	if err != nil {
		fmt.Println("Error:", err)
	}
	fmt.Println("Relative Path:", relativePath)
}

7.文件路径遍历

代码如下(示例):

go 复制代码
// Walk和WalkDir函数用于遍历指定目录下的所有文件和子目录,并在遍历过程中打印每个访问的路径
func Walk(root string, walkFn WalkFunc) error
func WalkDir(root string, walkFn WalkDirFunc) error

package main

import (
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	root := "/export/graylog"
	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err

		}
		fmt.Println("Visited:", path)
		return nil
	})
	if err != nil {
		fmt.Println("Error:", err)
	}
}

8.根据文件扩展名过滤文件

代码如下(示例):

go 复制代码
// 在WalkFunc中添加条件来过滤特定扩展名的文件
package main

import (
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	root := "/export"
	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if filepath.Ext(path) == ".yml" {
			fmt.Println("Visited:", path)
		}
		return nil
	})
	if err != nil {
		fmt.Println("Error:", err)
	}
}

9.使用正则表达式进行路径匹配

代码如下(示例):

go 复制代码
package main

import (
	"fmt"
	"os"
	"path/filepath"
	"regexp"
)

func main() {
	// 目录路径
	dir := "/export/graylog"
	
	// 正则表达式,用来匹配 .yml 或 .xml 结尾的文件
	pattern := `\.yml$|\.xml$`
	re, err := regexp.Compile(pattern)
	if err != nil {
		fmt.Println("Error compiling regex:", err)
		return
	}

	// 使用 filepath.Walk 遍历目录及子目录
	err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			fmt.Println("Error walking path:", err)
			return err
		}
		// 如果是文件且符合后缀名要求,进行匹配
		if !info.IsDir() && re.MatchString(info.Name()) {
			fmt.Println("Matched file:", path)
		}
		return nil
	})

	if err != nil {
		fmt.Println("Error during Walk:", err)
	}
}

相关推荐
呉師傅3 分钟前
【使用技巧】Adobe Photoshop 2024调整缩放与布局125%后出现点菜单项漂移问题的简单处理
运维·服务器·windows·adobe·电脑·photoshop
heartbeat..7 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
小Tomkk33 分钟前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
赌博羊33 分钟前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·运维·gnu
消失的旧时光-19431 小时前
Linux 入门核心命令清单(工程版)
linux·运维·服务器
艾莉丝努力练剑1 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
小天源1 小时前
Cacti在Debian/Ubuntu中安装及其使用
运维·ubuntu·debian·cacti
Trouvaille ~2 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
芷栀夏2 小时前
深度解析 CANN 异构计算架构:基于 ACL API 的算子调用实战
运维·人工智能·开源·cann
全栈工程师修炼指南2 小时前
Nginx | stream 四层反向代理:SSL、PREREAD 阶段模块指令浅析与实践
运维·网络·网络协议·nginx·ssl