go标准库之os模块

222 阅读2分钟

文件目录操作

package main

import (
	"fmt"
	"os"
)

// 创建文件
func createFile() {
	// 文件会放在 go.mod 定义的模块下(一般为项目文件目录)
	f, err := os.Create("a.txt")
	if err != nil {
		// 创建失败 打印错误
		fmt.Printf("err: %v\\n", err)
	} else {
		// 创建成功 打印文件名称
		fmt.Printf("f: %v\\n", f.Name())
	}
}

// 创建目录
func makeDir() {
	// ModePerm代表最高权限创建
	err := os.Mkdir("demo", os.ModePerm)
	if err != nil {
		fmt.Printf("err: %v\\n", err)
	}

	// 创建a目录下的b目录下的c目录
	err2 := os.MkdirAll("a/b/c", os.ModePerm)
	if err2 != nil {
		fmt.Printf("err: %v\\n", err)
	}
}

// 删除目录或者文件
func remove() {
	err := os.Remove("a.txt")
	if err != nil {
		fmt.Printf("err: %v\\n", err)
	}

	// 删除a目录包括里面的所有内容
	err2 := os.RemoveAll("a")
	if err2 != nil {
		fmt.Printf("err: %v\\n", err)
	}
}

// 获取工作目录(根路径 )
func getWd() {
	dir, _ := os.Getwd()
	fmt.Printf("dir: %v\\n", dir)
}

// 修改工作目录
func chWd() {
	err := os.Chdir("d:/")
	if err != nil {
		fmt.Printf("err: %v\\n", err)
	}
	fmt.Println(os.Getwd())
}

// 获取临时目录
func getTemp() {
	s := os.TempDir()
	fmt.Printf("s: %v\\n", s)
}

// 重命名文件
func renameFile() {
	err := os.Rename("test.txt", "test2.txt")
	if err != nil {
		fmt.Printf("err: %v\\n", err)
	}
}

// 读文件
func readFile() {
	b, err := os.ReadFile("test2.txt")
	if err != nil {
		fmt.Printf("err: %v\\n", err)
	} else {
		fmt.Printf("string(b[:]): %v\\n", string(b[:]))
	}
}

// 写文件
func writeFile() {
	s := "hello world"
	// 如果没有该文件会创建 如果文件有内容会覆盖
	os.WriteFile("test.txt", []byte(s), os.ModePerm)
}

func main() {
	// createFile()
	// makeDir()
	// remove()
	// getWd()
	// chWd
	// getTemp()
	// renameFile()
	// readFile()
	writeFile()
}

File文件读操作

File 结构体相关的文件读操作

package main

import (
	"fmt"
	"os"
)

// 打开文件
func openClose() {
	// f, err := os.Open("test.txt")

	// 或者高级的写法 给一个读写与创建(不存在会创建)的权限755
	f, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE, 755)

	if err != nil {
		fmt.Printf("err: %v\n", err)
	} else {
		fmt.Printf("f.Name(): %v\n", f.Name())
		f.Close()
	}
}

// 创建文件
func createFile() {
	// 使用Create创建 等价于 OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
	f, _ := os.Create("a2.txt")
	fmt.Printf("f.Name(): %v\n", f.Name())

	// 或者使用CreateTemp创建 第一个参数 目录默认:Temp(临时目录) 第二个参数 文件名前缀
	f2, _ := os.CreateTemp("", "temp")
	fmt.Printf("f2.Name(): %v\n", f2.Name()) // f2.Name(): C:\Users\xxx\AppData\Local\Temp\temp1166618816
}

func readOps() {
	f, _ := os.Open("test.txt")

	/* 循环读取 知道读完 */
	// for {
	// 	// 每次读取10个字符 包括空格
	// 	buf := make([]byte, 10)
	// 	n, err := f.Read(buf)
	// 	if err == io.EOF { // 读取完毕
	// 		break
	// 	}
	// 	fmt.Printf("n: %v\n", n)
	// 	fmt.Printf("string(buf): %v\n", string(buf))
	// }

	/* 从第3个开始读 */
	// buf := make([]byte, 3)   // 每次读3给字符
	// n, _ := f.ReadAt(buf, 3) // 从第三个读取
	// fmt.Printf("n: %v\n", n)
	// fmt.Printf("string(buf): %v\n", string(buf))

	/* 遍历a目录下的b和c目录 */
	// de, _ := os.ReadDir("a")
	// for _, v := range de {
	// 	fmt.Printf("v.Name(): %v\n", v.Name())
	// 	fmt.Printf("v.IsDir(): %v\n", v.IsDir()) // 判断是否为目录 true/false
	// }

	/* 定位 */
	// 从第3个位置开始的 读取100个字符
	f.Seek(3, 0)
	buf := make([]byte, 100)
	n, _ := f.Read(buf)
	fmt.Printf("n: %v\n", n)
	fmt.Printf("string(buf): %v\n", string(buf))

	f.Close()
}

func main() {
	// openClose()
	// createFile()
	readOps()
}

File文件写操作

package main

import "os"

func wirte() {
	// os.O_RDWR会把文件前面对应的长度内容覆盖 后面的内容不覆盖
	// os.O_APPEND在后面追加
	f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_APPEND, 0755)

	f.Write([]byte("hello golang"))
	f.Close()
}

func writeString() {
	f, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_APPEND, 0755)
	f.WriteString("hello java")
	f.Close()
}

func writeAt() {
	f, _ := os.OpenFile("test.txt", os.O_RDWR, 0755)
	// 从第三个位置开始写入 覆盖对应长度的内容 在后面的不覆盖
	f.WriteAt([]byte("aaa"), 3)
	f.Close()
}

func main() {
	// wirte()
	// writeString()
	writeAt()
}