Go 1.19.4 路径和目录-Day 15

1. 路径介绍

存储设备保存着数据,但是得有一种方便的模式让用户可以定位资源位置,操作系统采用一种路径字符 串的表达方式,这是一棵倒置的层级目录树,从根开始。

  • 相对路径:不是以根目录开始的路径,例如 a/b 、 a/b/c 、 . 、 ../a/b 、 ./a/b/c
  • 绝对路径:以斜杆开始的路径,例如 /a/b 、 /a/b/c 、 /t/../a/b ,window需要盘符 e:\a\b\c
  • 路径分隔符:windows为 \ ,但是也支持 / ;Linux系统等为 /

2. 路径处理包

为了方便处理,Go语言标准库提供path包和更加方便的path/filepath包,使用filepath即可。

3. 路径拼接(filepath.Join)

作用:

        由于路径是字符串,直接使用字符串拼接就可以了,也可以使用filepath.Join方法。

        推荐使用filepath.Join,这个函数会将多个字符串参数组合成一个路径,并且会根据操作系统的要求,自动插入正确的路径分隔符。

语法:

        func filepath.Join(elem ...string) string

参数:

        elem ...string:相对路径或者绝对路径。

返回值:

        string:合并后的完整路径。

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	p1 := "/a/b" + "/" + "c/d" + "/" + "f"

    // 就算写错了分隔符,filepath.Join也会自动处理为正确的
	p2 := filepath.Join("a/b", "c/d", "f") // 相对路径
    p3 := filepath.Join("/a", "b", "c") // 绝对路径

	fmt.Println(p1)
	fmt.Println(p2)

}
=============调试结果=============
/a/b/c/d/f
a\b\c\d\f
\a\b\c

4. 路径分解

就是提取完整路径中的某一部分。

4.1 提取目录(filepath.Dir)

作用:

        filepath.Dir 函数用于从完整的文件路径中提取目录部分。这个函数会返回给定路径中,文件名之前的目录路径。

语法:

        func filepath.Dir(path string) string

参数:

        表示完整的文件路径。

返回值:

        string:成功提取的目录部分。

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	// 注意a前面没有/,所以是个相对路径
	fmt.Println("======filepath.Join======")
	p1 := filepath.Join("a/b", "c/d", "f", "mysql.ini")
	fmt.Printf("p1的类型=%T\np1的值=%+[1]v\n", p1)
	fmt.Println("======filepath.Dir======")
	dir := filepath.Dir(p1) // 提取目录
	fmt.Printf("dir=%s\n", dir)
}
======filepath.Join======
p1的类型=string
p1的值=a\b\c\d\f\mysql.ini
======filepath.Dir======
dir=a\b\c\d\f

4.2 提取文件扩展名(filepath.Ext)

作用:

        Ext返回path使用的文件扩展名。扩展是path的最后一个元素的最后一个点开始的后缀;如果没有点,则为空。

语法:

        func filepath.Ext(path string) string

参数:

      path string:文件路径变量。

返回值:

          string:返回截取到的文件扩展名。

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	// 注意a前面没有/,所以是个相对路径
	fmt.Println("======filepath.Join======")
	p1 := filepath.Join("a/b", "c/d", "f", "mysql.ini")
	fmt.Printf("p1的类型=%T\np1的值=%+[1]v\n", p1)
	fmt.Println("======filepath.Ext======")
	dir := filepath.Ext(p1)
	fmt.Printf("dir=%s", dir)
}
======filepath.Join======
p1的类型=string
p1的值=a\b\c\d\f\mysql.ini
======filepath.Ext======
dir=.ini

4.3 提取文件名(filepath.Base)

作用:

        filepath.Base 函数用于从完整的文件路径中提取文件名部分。这个函数会返回给定路径中的最后一个元素,即文件名或目录名。

语法:

        func filepath.Base(path string) string

参数:

        path string:完整的文件路径。

返回值:

        string:表示从给定路径中提取的最后一个元素,即文件名或目录名。

import (
	"fmt"
	"path/filepath"
)

func main() {
	// 提取文件名
	base := filepath.Base("path/to/the/file.txt")
	fmt.Println(base) // 输出: file.txt

	// 处理绝对路径
	baseAbsolute := filepath.Base("/home/user/file.txt")
	fmt.Println(baseAbsolute) // 输出: file.txt

	// 处理只有目录没有文件名的路径
	baseDir := filepath.Base("path/to/")
	fmt.Println(baseDir) // 输出: (空字符串,因为路径以斜杠结尾)

	// 处理根目录
	baseRoot := filepath.Base("/home")
	fmt.Println(baseRoot) // 输出: home

	// 处理没有目录的文件名
	baseNoDir := filepath.Base("file.txt")
	fmt.Println(baseNoDir) // 输出: file.txt

	// 处理隐藏文件
	baseHidden := filepath.Base(".hiddenfile")
	fmt.Println(baseHidden) // 输出: .hiddenfile
}

5. 目录

5.1 获取当前工作目录(os.Getwd)

作用:

        Getwd返回与当前目录对应的根路径名(注意是程序的运行目录)。如果当前目录可以通过多个路径到达(由于符号链接),Getwd可能返回其中的任何一个。

语法:

        func os.Getwd() (dir string, err error)

返回值:

        dir string:表示当前工作目录的路径。

        err error:如果发生错误,返回错误对象;否则返回 nil

package main

import (
	"fmt"
	"os"
)

func main() {
	dir, err := os.Getwd()
	if err != nil {
		panic(err)
	} else {
		fmt.Printf("当前工作目录=%s", dir) 
	}
}
=======调试结果=======
当前工作目录=d:\个人\GO开发\20240624

5.2 获取当前登录用户的家目录(os.UserHomeDir)

作用:

        os.UserHomeDir 函数用于获取当前用户的主目录路径。

        os.UserHomeDir 在不同的操作系统上都能正常工作,它会根据操作系统的环境变量(如 HOME 在 Unix 系统上,USERPROFILE 或 HOMEPATH 在 Windows 系统上)来确定用户的主目录。
 

语法:

        func UserHomeDir() (string, error)

返回值:

        string:表示当前用户的主目录路径。

        error:如果发生错误,返回错误对象;否则返回 nil

package main

import (
	"fmt"
	"os"
)

func main() {
	s, err := os.UserHomeDir()
	if err != nil {
		panic(err)
	} else {
		fmt.Printf("当前登录用户家目录=%s", s)
	}
}
=======调试结果=======
当前登录用户家目录=C:\Users\123456

6. 绝对路径

6.1 判断绝对路径(filepath.IsAbs)

作用:

        filepath.IsAbs 函数用于检查给定的路径是否是绝对路径。

语法:

        func filepath.IsAbs(path string) (b bool)

参数:

      path string:  表示要检查的文件路径。

返回值:

        b bool:如果路径是绝对路径,则返回 true;否则返回 false

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	p1 := filepath.Join("a/b", "c/d", "f", "mysql.ini")
	fmt.Printf("p1的路径=%s\n", p1)

	path := filepath.IsAbs(p1)
	fmt.Printf("p1是否为绝对路径=%v", path)
}
=====调试结果=====
p1的路径=a\b\c\d\f\mysql.ini
p1是否为绝对路径=false

6.2 将相对路径转换为绝对路径(filepath.Abs)

作用:

        filepath.Abs 函数用于将相对路径转换为绝对路径。

        它根据当前工作目录(程序运行目录)和提供的相对路径来计算绝对路径。

语法:

        func filepath.Abs(path string) (string, error)

参数:

        path string:表示要转换的相对文件路径。

返回值:

        string:表示转换后的绝对路径。

        error:如果发生错误,返回错误对象;否则返回 nil

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	p1 := filepath.Join("a/b", "c/d", "f", "mysql.ini")
	fmt.Printf("p1的路径=%s\n", p1)

	abs, err := filepath.Abs(p1)
	if err != nil {
		panic(err)
	} else {
		fmt.Printf("Abs处理后的绝对路径=%s", abs)
	}
}
=====调试结果=====
p1的路径=a\b\c\d\f\mysql.ini
Abs处理后的绝对路径=d:\个人\GO开发\20240624\a\b\c\d\f\mysql.ini

7. 存在性检测

7.1 获取文件或目录信息(os.Stat)

作用:

        os.Stat 函数用于获取文件或目录的状态信息。这个函数是 os 包的一部分,它返回一个 fs.FileInfo 接口,该接口提供了文件的大小、修改时间、权限等信息。

语法:

        func os.Stat(name string) (fs.FileInfo, error)

参数:

    name string:表示要获取状态信息的文件或目录的路径。

返回值:

        fs.FileInfo:一个实现了 FileInfo 接口的对象,包含了文件或目录的详细信息。

        error:如果发生错误,返回错误对象;否则返回 nil

package main

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

func main() {
	p1 := filepath.Join("a/b", "c/d", "f", "mysql.ini")
	fmt.Printf("p1的路径=%s\n", p1)

	fi, err := os.Stat(p1)
	if err != nil {
		fmt.Println("获取文件信息异常:", err)
	} else {
		fmt.Println(fi)
	}
}
=====调试结果=====
p1的路径=a\b\c\d\f\mysql.ini
获取文件信息异常: CreateFile a\b\c\d\f\mysql.ini: The system cannot find the path specified.

7.2 检测文件或目录是否存在

7.2.1 os.IsNotExist

作用:

        os.IsNotExist 函数用于检查一个错误是否表示文件或目录不存在的错误。

语法:

        func os.IsNotExist(err error) bool

参数:

        err error:表示要检查的错误对象。

返回值:

        bool:如果错误表示文件已存在,则返回 true;否则返回 false

package main

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

func main() {
	fmt.Println("==========调试结果==========")

	p1 := filepath.Join("a/b", "c/d", "f", "mysql.ini")
	fmt.Printf("p1的路径=%s\n", p1)

	fi, err := os.Stat(p1)
	if err != nil {
		fmt.Printf("获取文件信息异常:%s\n文件不存在:%v\n", err, os.IsNotExist(err))
	} else {
		fmt.Println(fi)
	}
}
==========调试结果==========
p1的路径=a\b\c\d\f\mysql.ini
获取文件信息异常:CreateFile a\b\c\d\f\mysql.ini: The system cannot find the path specified.
文件不存在:true

8. 创建目录和文件

8.1 创建目录

创建目录主要有这3个函数:

  1. os.Mkdir
    创建一个新的子目录,父目录必须存在,否则报错。
  2. os.MkdirAll
    递归创建一个目录路径。
  3. os.MkdirTemp
    创建一个临时目录。

8.1.1 os.MkdirAll

作用:

        os.MkdirAll 函数是 Go 语言标准库 os 包中的一个函数,用于递归创建一个目录路径,包括任何必要的中间目录。这个函数非常适合在需要确保整个目录结构都存在时使用,例如在创建文件之前。

        创建时,如果用的是相对路径,则会在程序所在目录下创建。

        目录已存在,创建也不会报错。

语法:

        func os.MkdirAll(path string, perm fs.FileMode) error

参数:

        path string:要创建的目录路径,可以包含多级目录。

        perm fs.FileMode:设置目录的权限。fs.FileMode 是一个类型,通常使用常量如 fs.ModePerm来表示权限,也可以手动指定权限如0755

返回值:

        error:如果所有目录都成功创建,则返回 nil;如果发生错误(例如,权限不足),则返回错误对象。

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("==========调试结果==========")
	
	err := os.MkdirAll("d:/个人/学习/Go/文件与目录操作/创建测试", os.ModePerm) // os.ModePerm默认权限为511
    // err := os.MkdirAll("创建测试", os.ModePerm)// 如果是相对路径,则会在程序所在目录下创建
	if err != nil {
		fmt.Println("目录创建失败:", err)
	} else {
		fmt.Println("递归创建目录成功!")
	}
}
==========调试结果==========
递归创建目录成功!

8.2 创建文件

创建文件可以使用os包中的两个函数:

  • os.Create
    注意:如果文件已经存在了,该函数会先清空文件中原本的内容,再创建。
  • os.OpenFile
    OpenFile能够更细粒度的去控制文件的权限。

8.2.1 os.Create

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("==========调试结果==========")

	f, err := os.Create("d:/个人/学习/Go/文件与目录操作/创建测试/create-test.txt")
	if err != nil {
		panic(err)
	}
	fmt.Println("文件创建成功!")
	defer f.Close()
}
==========调试结果==========
文件创建成功!

9. 获取文件或目录元数据信息(Stat)

除了利用stat来判断文件是否存在,还可以检测文件元数据,如判断是否为目录、是否为文件、文件权限、大小、修改时间等。

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("==========调试结果==========")

	p1 := "d:/个人/学习/Go/文件与目录操作/创建测试/create-test.txt"
	fi, err := os.Stat(p1)
	if err != nil {
		panic(err)
	} else {
		fmt.Printf("文件名=%s\n是否为目录=%v\n文件的权限=%v\n文件的大小=%d\n文件的修改时间=%s\n", fi.Name(), fi.IsDir(), fi.Mode(), fi.Size(), fi.ModTime())
	}
}
==========调试结果==========
文件名=create-test.txt
是否为目录=false
文件的权限=-rw-rw-rw-
文件的大小=0
文件的修改时间=2024-09-04 15:44:45.291237 +0800 CST

10. 遍历目录

10.1 os.ReadDir(非递归遍历)

作用:

        读取指定目录下的所有条目(包括文件和子目录),非递归。

语法:

        func os.ReadDir(name string) ([]fs.DirEntry, error)

参数:

        name string:要读取的目录的路径。

返回值:

        []fs.DirEntry:一个包含 fs.DirEntry 接口的切片,每个条目代表目录中的一个文件或子目录。

        error:如果读取目录过程中发生错误,则返回错误对象;否则返回 nil

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("==========调试结果==========")

	de, err := os.ReadDir("D:/个人/学习/Go/文件与目录操作")
	if err != nil {
		panic(err)
	}
	fmt.Println(de)
	for i, v := range de {
		fmt.Println(i, v, v.Name(), v.Type(), v.IsDir())
	}
}
==========调试结果==========
[{0xc00010a000} {0xc00010a070}]
0 {0xc00010a000} test.txt ---------- false
1 {0xc00010a070} 创建测试 d--------- true

10.2 filepath.WalkDir(递归遍历)

作用:

        用于递归遍历一个目录及其所有子目录中的文件和子目录。

语法:

        func filepath.WalkDir(root string, fn fs.WalkDirFunc) error

参数:

        root string:要遍历的根目录的路径。

        fn fs.WalkDirFunc:一个回调函数,用于处理每个文件和目录。它接收三个参数:当前遍历到的路径、一个 fs.DirEntry 对象(包含文件或目录的信息),以及在读取目录时可能发生的错误。

返回值:

        error:如果遍历过程中发生错误,则返回错误对象;否则返回 nil

package main

import (
	"fmt"
	"io/fs"
	"path/filepath"
)

func main() {
	fmt.Println("==========调试结果==========")
	
	filepath.WalkDir(
		"D:/个人/学习/Go/文件与目录操作",
		func(path string, d fs.DirEntry, err error) error {
			fmt.Println(path, d.Name(), d.IsDir())
			return err
		}) // path string,就是遍历过程中遍历到的文件或目录
}
==========调试结果==========
D:/个人/学习/Go/文件与目录操作 文件与目录操作 true
D:\个人\学习\Go\文件与目录操作\test.txt test.txt false
D:\个人\学习\Go\文件与目录操作\创建测试 创建测试 true
D:\个人\学习\Go\文件与目录操作\创建测试\create-test.txt create-test.txt false

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/879261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt笔记】QScrollArea控件详解

目录 引言 一、QScrollArea 的基本概念 二、QScrollArea 的主要属性 2.1 设置内容大小是否随滚动区域变化 2.2 设置水平与垂直滚动条 2.3 设置视口外边距 三、QScrollArea 的常用方法 3.1 设置显示小部件 3.2 返回当前设置的小部件 3.3 设置内部小部件是否可以填充…

【bug】通过lora方式微调sdxl inpainting踩坑

报错内容 ValueError: Attempting to unscale FP16 gradients. 报错位置 if accelerator.sync_gradients:params_to_clip (itertools.chain(unet_lora_parameters, text_lora_parameters_one, text_lora_parameters_two)if args.train_text_encoderelse unet_lora_parameters…

ICP算法介绍,机器人姿态估计,三维点云配准

介绍 ICP算法,即Iterative Closest Point(迭代最近点)算法,是一种广泛应用于计算机视觉和图像处理领域的几何配准算法。它的主要目的是通过最小化两组点集之间的距离来找出一组变换,使得两组点集尽可能地对齐。ICP算法…

37拼购:电商新风尚,共享双赢的购物革命

随着2024年电商市场的日益繁荣,商品海洋中的同质化问题愈发严峻,消费者在茫茫商海中寻觅独特价值的难度陡增。在此背景下,一种名为“37悦享拼”的创新电商模式横空出世,它巧妙融合了私域社交与电商精髓,旨在打破传统壁…

9.18作业

提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格、其他字符的个数并输出 代码展示 #include <iostream>using namespace std;int main() {string str;int countc 0; // 字母计数int countn 0; // 数字计数int count 0; // 空格计数int counto 0;…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

Java | Leetcode Java题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; class Solution {public String removeKdigits(String num, int k) {Deque<Character> deque new LinkedList<Character>();int length num.length();for (int i 0; i < length; i) {char digit num.charAt(i);while (!…

ERP进销存管理系统的业务全流程 Axure高保真原型源文件分享

这是一套ERP进销存管理系统的业务全流程Axure高保真原型设计文档。 原型预览地址&#xff1a;https://ppndif.axshare.com 产品意义&#xff1a; 提高工作效率&#xff1a; 电子记账替代手工记账&#xff0c;减少工作负担和人为错误。 实时查看库存情况&#xff0c;减少盘点时…

MySQL常用语句(一)

#数据库操作思路 #相关实验 <SQL语句简介> <web安全SQL语句基本操作> #数据库管理 #创建数据库 在与数据进行任何操作之前&#xff0c;需要创建一个数据库。数据库是数据的容器&#xff0c;用于存储和操作诸如表、数据库视图、触发器、存储过程等数据的数据集…

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

Alinx MPSoC驱动开发第17章I2C实验修改设备树后petalinux编译报错

问题描述 在使用Alinx的MPSoC Linux驱动开发手册第17章进行I2C驱动学习时&#xff0c;在按照手册&#xff0c;在system-user.dtsi文件最后添加引用i2c1节点内容&#xff1a; 然后使用petalinux-build命令进行编译&#xff0c;后报错如下&#xff1a; 尝试解决问题 1&#xff0c…

vscode软件在 C发中常用插件

一. 简介 本文简单介绍一下&#xff0c;当做 C开发时 vscode软件常用的插件。 vscode软件是 微软公司目前提供的一款免费的开发软件&#xff0c;可以通过 vscode官网下载 vscode。 二. vscode软件在 C开发中常用插件 注意&#xff1a;vscode软件安装后&#xff0c;可以直接…

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

鸿蒙开发之ArkUI 界面篇 九 QQ音乐登录界面揭秘

我们需要实现的效果如下图&#xff1a; : 分析&#xff0c;垂直方向&#xff0c;四个按钮&#xff0c;从上往下第一个是Image&#xff0c;第二个是Text、第三个是是Button、第四个是Button&#xff0c;垂直布局用Column&#xff0c;代码实现如下&#xff1a; Entry Component…

【C语言进阶】动态内存与柔性数组:C语言开发者必须知道的陷阱与技巧

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言动态内存管理 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C语言动态内存管理 &…

RabbitMQ 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 重要概念 1.1 Publisher 1.2 Message 1.3 Exchange 1.4 BindingKey 1.5 Routingkey 1.6 Queue 1.7 Consumer 1.8 Connection 1.9 Channel 1.10 Virtual Host 1.11Broker 2. RabbitMQ…

三菱变频器以模拟量电流进行频率设定(电流输入)

POINT 1、在 STF(STR)信号 ON 时&#xff0c;发出启动指令。2、请将 AU 信号置为 ON。 3、请设定 Pr.79 运行模式选择 “2”(外部运行模式)。 接线示例 重点&#xff1a;请将 AU 信号置为 ON。 操作示例&#xff1a;以 60Hz 运行。 1、接通电源时的画面&#xff0c;监视器显…

vue3+ant design vue 中弹窗自定义按钮设置及以冒号为基准布局

1、自定义弹窗按钮&#xff0c;去除取消和确定按钮。&#xff08;网上很多方法都是说通过插槽来实现&#xff0c;但是试了下不生效&#xff0c;那既然插槽不生效的话&#xff0c;干脆直接写按钮就好了&#xff09; <a-modalv-model:open"open"title"人员信息…

如何挑选适用的WMS 智能仓储管理系统?这份盘点攻略请收好!

本文将盘点十款WMS智能仓储管理系统&#xff0c;为企业选型提供参考&#xff01; 在现代企业的物流运作中&#xff0c;仓库就如同一个关键的枢纽&#xff0c;连接着生产与销售的各个环节。而一个高效的 WMS 智能仓储管理系统&#xff0c;就像是一位精明的管家&#xff0c;能让仓…

选购到不好的宠物空气净化器会有什么危害?有哪几款推荐

前三个月真的是被我男朋友气到了&#xff0c;明明说好的一起养猫&#xff0c;他又嫌这嫌那的&#xff0c;真的是无语住。 在养猫前的一个月就说好了&#xff0c;谁下班早谁就先回家收拾&#xff0c;包括进门开窗通风、给猫喂食、还有铲猫砂盆。但是他现在抱怨说太麻烦了&#…