
在操作系统(OS)中,标准库的权限管理是非常重要的,它确保了不同用户和进程能够安全地访问系统资源。以下是一些常见的权限概念和说明:
文件权限通常表示为三个八进制数字,分别代表所有者、组和其他用户的权限。例如,权限 755 表示:
chmod 755 file.txt 将文件 file.txt 的权限设置为 755。chown user:group file.txt 将文件 file.txt 的所有者更改为 user,组更改为 group。chgrp group file.txt 将文件 file.txt 的组更改为 group。access("file.txt", R_OK) 检查当前用户是否有读取 file.txt 的权限。su root 切换到根用户。
os.Create函数用于创建一个新文件或截断一个已存在的文件。如果文件已经存在,它将被截断为零长度。
func main() {
f, err := os.Create("test.txt")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
}创建文件的时候文件中的内容会被清空

text.txt中原本有一行文本

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

os.Mkdir函数用于创建一个新目录。如果目录已经存在,os.Mkdir会返回一个错误。os.MkdirAll函数用于创建一个多级新目录。如果目录已经存在,os.MkdirAll会返回一个错误。
func textMkdir() {
err := os.Mkdir("testdir", 0777)
if err != nil {
fmt.Println(err)
return
}
}运行代码之后会在左侧创建一个新的目录,新目录与main.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会返回一个错误。
// 删除单个文件或目录
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
}
}删除之前的目录

删除之后的目录

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

// 修改当前工作目录
func textChdir() {
err := os.Chdir("testdir")
if err != nil {
fmt.Println(err)
return
}
}
可以看出工作目录被修改完成。

// 获取临时目录
func textTempDir() {
dir := os.TempDir()
fmt.Println(dir)
}
// 修改文件名称
func textRename() {
err := os.Rename("text01.txt", "text1.txt")
if err != nil {
fmt.Println(err)
return
}
}

在 Go 语言中,文件读取可以通过多种方式实现,具体取决于你的需求。下面是几种常见的文件读取方法的详细讲解。
ioutil.ReadFile 函数这种方法适合小型文件,简单易用。
func textReadFile() {
// 读取文件
data, err := ioutil.ReadFile("text1.txt")
if err != nil {
log.Fatalf("读取文件时出错: %v", err)
}
// 输出文件内容
fmt.Println(string(data))
}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)
}
}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 语言中,文件写入操作可以通过多个方式实现。下面详细介绍几种常见的文件写入方法。
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("成功写入文件!")
}os.OpenFile 以追加模式写入这种方法适合在已有文件的末尾添加内容,而不会覆盖原有内容。
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("成功追加内容到文件!")
}
