go语言的成神之路-标准库篇-os标准库

一、权限

在操作系统(OS)中,标准库的权限管理是非常重要的,它确保了不同用户和进程能够安全地访问系统资源。以下是一些常见的权限概念和说明:

1.用户权限

  • 用户ID(UID):每个用户在系统中都有一个唯一的用户ID。根用户(root)的UID通常是0。
  • 组ID(GID):用户可以属于一个或多个组,每个组也有一个唯一的组ID。

2. 文件权限

  • 读(r):允许用户读取文件内容。
  • 写(w):允许用户修改文件内容。
  • 执行(x):允许用户执行文件(如果文件是可执行的)。

文件权限通常表示为三个八进制数字,分别代表所有者、组和其他用户的权限。例如,权限 755 表示:

  • 所有者有读、写和执行权限(7 = 4+2+1)。
  • 组用户有读和执行权限(5 = 4+1)。
  • 其他用户有读和执行权限(5 = 4+1)。

3. 目录权限

  • 读(r):允许用户列出目录内容。
  • 写(w):允许用户在目录中创建或删除文件。
  • 执行(x):允许用户进入目录(即访问目录中的文件)。

4. 权限设置命令

  • chmod :用于更改文件或目录的权限。例如,chmod 755 file.txt 将文件 file.txt 的权限设置为 755
  • chown :用于更改文件或目录的所有者。例如,chown user:group file.txt 将文件 file.txt 的所有者更改为 user,组更改为 group
  • chgrp :用于更改文件或目录的组。例如,chgrp group file.txt 将文件 file.txt 的组更改为 group

5. 特殊权限

  • SUID(Set User ID):当一个可执行文件设置了SUID位时,任何用户执行该文件时都会以文件所有者的权限运行。
  • SGID(Set Group ID):当一个目录设置了SGID位时,新创建的文件将继承目录的组权限。
  • 粘滞位(Sticky Bit):当一个目录设置了粘滞位时,只有文件的所有者或目录的所有者可以删除该目录中的文件。

6. 权限检查

  • access :用于检查用户是否有权限访问文件。例如,access("file.txt", R_OK) 检查当前用户是否有读取 file.txt 的权限。

7.权限管理工具

  • sudo:允许普通用户以超级用户(root)权限执行命令。
  • su :切换用户身份。例如,su root 切换到根用户。

二、目录文件等相关操作

1.os.Create

os.Create 函数用于创建一个新文件或截断一个已存在的文件。如果文件已经存在,它将被截断为零长度。

Go 复制代码
func main() {
	f, err := os.Create("test.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()
}

创建文件的时候文件中的内容会被清空

text.txt中原本有一行文本

运行完main.go之后会被清空

2.os.Mkdir和os.MkdirAll

os.Mkdir 函数用于创建一个新目录。如果目录已经存在,os.Mkdir 会返回一个错误。

os.MkdirAll 函数用于创建一个多级新目录。如果目录已经存在,os.MkdirAll 会返回一个错误。

Mkdir代码示例:

Go 复制代码
func textMkdir() {
	err := os.Mkdir("testdir", 0777)
	if err != nil {
		fmt.Println(err)
		return
	}
}

运行代码之后会在左侧创建一个新的目录,新目录与main.go同级。

MkdirAll代码示例:

Go 复制代码
func textMkdirAll() {
	err := os.MkdirAll("testdir1/testdir2/testdir3", 0777)
	if err != nil {
		fmt.Println(err)
		return
	}
}

与Mkdir不同的是它可以创建多级目录

3.os.Remove和os.RemoveAll

os.Remove函数用于删除一个新目录。如果目录已经存在,os.Remove会返回一个错误。

os.RemoveAll函数用于删除一个多级新目录。如果目录已经存在,os.RemoveAll会返回一个错误。

Go 复制代码
// 删除单个文件或目录
func textRemove() {
	err := os.Remove("test.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
}

// 删除目录及其内容
func textRemoveAll() {
	err := os.RemoveAll("testdir1")
	if err != nil {
		fmt.Println(err)
		return
	}
}

删除之前的目录

删除之后的目录

3.os.Getwd

Go 复制代码
// 获取当前工作目录
func textGetwd() {
	dir, err := os.Getwd()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(dir)
}

可以获取main.go所属的目录

4.os.Chdir

Go 复制代码
// 修改当前工作目录
func textChdir() {
	err := os.Chdir("testdir")
	if err != nil {
		fmt.Println(err)
		return
	}
}

可以看出工作目录被修改完成。

5. os.TempDir

Go 复制代码
// 获取临时目录
func textTempDir() {
	dir := os.TempDir()
	fmt.Println(dir)
}

6.os.Rename

Go 复制代码
// 修改文件名称
func textRename() {
	err := os.Rename("text01.txt", "text1.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
}

三、文件读取详解

在 Go 语言中,文件读取可以通过多种方式实现,具体取决于你的需求。下面是几种常见的文件读取方法的详细讲解。

1.使用 ioutil.ReadFile 函数

这种方法适合小型文件,简单易用。

Go 复制代码
func textReadFile() {
	// 读取文件
	data, err := ioutil.ReadFile("text1.txt")
	if err != nil {
		log.Fatalf("读取文件时出错: %v", err)
	}

	// 输出文件内容
	fmt.Println(string(data))
}

2.使用 os.Openbufio.Scanner

这种方法适合逐行读取文件,尤其是处理大文件时。

Go 复制代码
func textOpenFile() {
	file, err := os.Open("text2.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close() // 确保在函数结束时关闭文件

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		fmt.Println(scanner.Text()) // 逐行打印文件内容
	}

	// 检查扫描过程中是否出现错误
	if err := scanner.Err(); err != nil {
		fmt.Println(err)
	}
}

3.使用 os.Openio.Reader 读取文件

这种方法使你能够自定义读取逻辑,比如限量读取等。

Go 复制代码
func textReader() {
	// 尝试打开名为 "example.txt" 的文件
	file, err := os.Open("example.txt")
	if err != nil {
		// 如果打开文件时发生错误,打印错误信息并返回
		fmt.Println(err)
		return
	}
	// 确保在函数退出时关闭文件
	defer file.Close()

	// 创建一个大小为 1024 字节的缓冲区,用于读取文件内容
	buffer := make([]byte, 1024) 
	for {
		// 读取文件中的数据到缓冲区,并返回实际读取的字节数 n 和可能的错误
		n, err := file.Read(buffer)
		// 检查读取过程中是否出现错误,且错误不是文件末尾指示符
		if err != nil && err != io.EOF {
			// 打印错误信息并返回
			fmt.Println(err)
			return
		}
		// 如果返回的字节数为 0,表示已读到文件末尾
		if n == 0 {
			break
		}
		// 打印缓冲区中读取的数据(仅打印实际读取的字节数,避免多余的打印)
		fmt.Print(string(buffer[:n])) 
	}
}

四、文件写入操作

在 Go 语言中,文件写入操作可以通过多个方式实现。下面详细介绍几种常见的文件写入方法。

1. 使用 os.Createio.WriteString

这种方法适合创建新文件并写入内容。如果文件已存在,将被截断。

Go 复制代码
func TextCreateFile() {
	// 创建新文件(若文件已存在则被截断)
	file, err := os.Create("text01.txt")
	if err != nil {
		fmt.Println("创建文件时出错:", err)
		return
	}
	defer file.Close() // 确保在函数最后关闭文件

	// 写入字符串到文件
	_, err = file.WriteString("Hello, Go!\n")
	if err != nil {
		fmt.Println("写入文件时出错:", err)
		return
	}
	fmt.Println("成功写入文件!")
}

2. 使用 os.OpenFile 以追加模式写入

这种方法适合在已有文件的末尾添加内容,而不会覆盖原有内容。

Go 复制代码
func textOpenfile() {
	// 打开一个文件,如果不存在则创建,权限为 0644
	file, err := os.OpenFile("text02.txt", os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println("打开文件时出错:", err)
		return
	}
	defer file.Close() // 确保在函数最后关闭文件

	_, err = file.WriteString("Appending this line.\n")
	if err != nil {
		fmt.Println("写入文件时出错:", err)
		return
	}

	fmt.Println("成功追加内容到文件!")
}
相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
GetcharZp5 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
Yana.nice5 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
2601_960567968 小时前
电商套图自动化效率的工程量化分析——从逐张生成到批量套图的架构演进
运维·架构·自动化
weixin_446260858 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
a1117768 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习