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

ops/2024/12/15 1:01:25/

一、权限

在操作系统(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 函数用于创建一个新文件或截断一个已存在的文件。如果文件已经存在,它将被截断为零长度。

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代码示例:

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

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

 

MkdirAll代码示例:

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会返回一个错误。

// 删除单个文件或目录
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

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

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

4.os.Chdir

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

 

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

5. os.TempDir

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

6.os.Rename

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

三、文件读取详解

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

1.使用 ioutil.ReadFile 函数

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

func textReadFile() {// 读取文件data, err := ioutil.ReadFile("text1.txt")if err != nil {log.Fatalf("读取文件时出错: %v", err)}// 输出文件内容fmt.Println(string(data))
}

2.使用 os.Open 和 bufio.Scanner

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

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.Open 和 io.Reader 读取文件

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

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.Create 和 io.WriteString

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

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 以追加模式写入

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

func textOpenfile() {// 打开一个文件,如果不存在则创建,权限为 0644file, 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("成功追加内容到文件!")
}


http://www.ppmy.cn/ops/141961.html

相关文章

MySQL之数据库三大范式

一、什么是范式? 范式是数据库遵循设计时遵循的一种规范,不同的规范要求遵循不同的范式。 (范式是具有最小冗余的表结构) 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式(1NF/2NF/3NF…

手机使用笔记

文章目录 配置一键换机 手机玩的很菜,做个笔记,有时自己找着方便。 配置 怕手机的配置不够,要不要弄顶配。 实际如果不玩游戏,根本遇不到性能瓶颈,现在的芯片都这么强,应对办公和多开早就轻轻松松。 随便…

我在广州学 Mysql 系列之 数据“表”的基本操作

ℹ️大家好,我是😆练小杰,今天主要讲得是Mysql数据表的基本操作内容~~ 昨天讲了“Mysql 数据“库“的基本操作”~~ 想要了解更多🈶️MYSQL 数据库的命令行总结!!! “真相永远只有一个”——工藤…

根据契约进行分析--录像店案例研究01

Richard Mitchell 著,zhen_lei 译 本文包括录像店案例研究的一些片段,用来说明根据契约进行分析的原理。本文假定读者已经从其它渠道学习了一些关于根据契约进行分析的方法。 完整的一套模型可以写成一本书。这些选择的片段用来说明开发的某些方面&…

【计算机视觉】医疗图像关键点识别

1. CNN 1.1. 设备参数 1.2. 代码 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision import transforms from tqdm import tqdm import os import cv2 import numpy as np import time im…

java和go语言的优劣

Java 和 Go 是两种非常流行的编程语言,各自拥有独特的特性和优势。它们在不同的应用场景中表现出色,选择哪种语言取决于具体的项目需求、团队技能以及个人偏好。下面我们将从多个维度对比 Java 和 Go 的优劣,帮助您更好地理解这两种语言的特点…

前端成长之路:HTML(1)

每个网页都会有一个基本的结构标签&#xff08;也称为骨架标签&#xff09;&#xff0c;页面内容也是在这些基本标签上书写。 基本结构标签&#xff08;骨架标签&#xff09; <html></html>标签是HTML标签&#xff0c;是页面中最大的标签&#xff0c;被称为根标签…

渗透测试工具 -- SQLmap安装教程及使用

随着网络安全问题日益严峻&#xff0c;渗透测试成为了保护信息安全的重要手段。而在渗透测试的众多工具中&#xff0c;SQLmap凭借其强大的自动化SQL注入检测和利用能力&#xff0c;成为了网络安全专家必备的利器。那么&#xff0c;你知道如何高效地使用SQLmap进行漏洞扫描吗&am…