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

宁睿  金牌会员 | 2024-12-14 01:52:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 876|帖子 876|积分 2638


一、权限

在利用系统(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 函数用于创建一个新文件或截断一个已存在的文件。如果文件已经存在,它将被截断为零长度。
  1. func main() {
  2.         f, err := os.Create("test.txt")
  3.         if err != nil {
  4.                 fmt.Println(err)
  5.                 return
  6.         }
  7.         defer f.Close()
  8. }
复制代码
 创建文件的时间文件中的内容会被清空

text.txt中原本有一行文本

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

2.os.Mkdir和os.MkdirAll

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

  1. func textMkdir() {
  2.         err := os.Mkdir("testdir", 0777)
  3.         if err != nil {
  4.                 fmt.Println(err)
  5.                 return
  6.         }
  7. }
复制代码
运行代码之后会在左侧创建一个新的目录,新目录与main.go同级。 
 

MkdirAll代码示例:

  1. func textMkdirAll() {
  2.         err := os.MkdirAll("testdir1/testdir2/testdir3", 0777)
  3.         if err != nil {
  4.                 fmt.Println(err)
  5.                 return
  6.         }
  7. }
复制代码
与Mkdir不同的是它可以创建多级目录 

3.os.Remove和os.RemoveAll
   os.Remove函数用于删除一个新目录。如果目录已经存在,os.Remove会返回一个错误。
  os.RemoveAll函数用于删除一个多级新目录。如果目录已经存在,os.RemoveAll会返回一个错误。
  
  1. // 删除单个文件或目录
  2. func textRemove() {
  3.         err := os.Remove("test.txt")
  4.         if err != nil {
  5.                 fmt.Println(err)
  6.                 return
  7.         }
  8. }
  9. // 删除目录及其内容
  10. func textRemoveAll() {
  11.         err := os.RemoveAll("testdir1")
  12.         if err != nil {
  13.                 fmt.Println(err)
  14.                 return
  15.         }
  16. }
复制代码
删除之前的目录 

删除之后的目录

3.os.Getwd

  1. // 获取当前工作目录
  2. func textGetwd() {
  3.         dir, err := os.Getwd()
  4.         if err != nil {
  5.                 fmt.Println(err)
  6.                 return
  7.         }
  8.         fmt.Println(dir)
  9. }
复制代码
可以获取main.go所属的目录 

4.os.Chdir

  1. // 修改当前工作目录
  2. func textChdir() {
  3.         err := os.Chdir("testdir")
  4.         if err != nil {
  5.                 fmt.Println(err)
  6.                 return
  7.         }
  8. }
复制代码

 

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

5. os.TempDir

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

6.os.Rename

  1. // 修改文件名称
  2. func textRename() {
  3.         err := os.Rename("text01.txt", "text1.txt")
  4.         if err != nil {
  5.                 fmt.Println(err)
  6.                 return
  7.         }
  8. }
复制代码


三、文件读取详解

在 Go 语言中,文件读取可以通过多种方式实现,详细取决于你的需求。下面是几种常见的文件读取方法的详细讲解。
1.利用 ioutil.ReadFile 函数

这种方法得当小型文件,简单易用。
  1. func textReadFile() {
  2.         // 读取文件
  3.         data, err := ioutil.ReadFile("text1.txt")
  4.         if err != nil {
  5.                 log.Fatalf("读取文件时出错: %v", err)
  6.         }
  7.         // 输出文件内容
  8.         fmt.Println(string(data))
  9. }
复制代码
2.利用 os.Open 和 bufio.Scanner

这种方法得当逐行读取文件,尤其是处理大文件时。
  1. func textOpenFile() {
  2.         file, err := os.Open("text2.txt")
  3.         if err != nil {
  4.                 fmt.Println(err)
  5.                 return
  6.         }
  7.         defer file.Close() // 确保在函数结束时关闭文件
  8.         scanner := bufio.NewScanner(file)
  9.         for scanner.Scan() {
  10.                 fmt.Println(scanner.Text()) // 逐行打印文件内容
  11.         }
  12.         // 检查扫描过程中是否出现错误
  13.         if err := scanner.Err(); err != nil {
  14.                 fmt.Println(err)
  15.         }
  16. }
复制代码
3.利用 os.Open 和 io.Reader 读取文件

这种方法使你能够自界说读取逻辑,好比限量读取等。
  1. func textReader() {
  2.         // 尝试打开名为 "example.txt" 的文件
  3.         file, err := os.Open("example.txt")
  4.         if err != nil {
  5.                 // 如果打开文件时发生错误,打印错误信息并返回
  6.                 fmt.Println(err)
  7.                 return
  8.         }
  9.         // 确保在函数退出时关闭文件
  10.         defer file.Close()
  11.         // 创建一个大小为 1024 字节的缓冲区,用于读取文件内容
  12.         buffer := make([]byte, 1024)
  13.         for {
  14.                 // 读取文件中的数据到缓冲区,并返回实际读取的字节数 n 和可能的错误
  15.                 n, err := file.Read(buffer)
  16.                 // 检查读取过程中是否出现错误,且错误不是文件末尾指示符
  17.                 if err != nil && err != io.EOF {
  18.                         // 打印错误信息并返回
  19.                         fmt.Println(err)
  20.                         return
  21.                 }
  22.                 // 如果返回的字节数为 0,表示已读到文件末尾
  23.                 if n == 0 {
  24.                         break
  25.                 }
  26.                 // 打印缓冲区中读取的数据(仅打印实际读取的字节数,避免多余的打印)
  27.                 fmt.Print(string(buffer[:n]))
  28.         }
  29. }
复制代码
四、文件写入利用

在 Go 语言中,文件写入利用可以通过多个方式实现。下面详细先容几种常见的文件写入方法。
1. 利用 os.Create 和 io.WriteString

这种方法得当创建新文件并写入内容。如果文件已存在,将被截断。
  1. func TextCreateFile() {
  2.         // 创建新文件(若文件已存在则被截断)
  3.         file, err := os.Create("text01.txt")
  4.         if err != nil {
  5.                 fmt.Println("创建文件时出错:", err)
  6.                 return
  7.         }
  8.         defer file.Close() // 确保在函数最后关闭文件
  9.         // 写入字符串到文件
  10.         _, err = file.WriteString("Hello, Go!\n")
  11.         if err != nil {
  12.                 fmt.Println("写入文件时出错:", err)
  13.                 return
  14.         }
  15.         fmt.Println("成功写入文件!")
  16. }
复制代码
2. 利用 os.OpenFile 以追加模式写入

这种方法得当在已有文件的末尾添加内容,而不会覆盖原有内容。
  1. func textOpenfile() {
  2.         // 打开一个文件,如果不存在则创建,权限为 0644
  3.         file, err := os.OpenFile("text02.txt", os.O_APPEND|os.O_WRONLY, 0644)
  4.         if err != nil {
  5.                 fmt.Println("打开文件时出错:", err)
  6.                 return
  7.         }
  8.         defer file.Close() // 确保在函数最后关闭文件
  9.         _, err = file.WriteString("Appending this line.\n")
  10.         if err != nil {
  11.                 fmt.Println("写入文件时出错:", err)
  12.                 return
  13.         }
  14.         fmt.Println("成功追加内容到文件!")
  15. }
复制代码








免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表