一、权限
在操作系统(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("成功追加内容到文件!")
}