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

相关推荐
草莓熊Lotso1 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
历程里程碑1 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
不老刘6 小时前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
七夜zippoe9 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64810 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满10 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠11 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90311 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技12 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市