# 5.1、Golang标准库-os 标准库文档:https://pkg.go.dev/std ## os模块-文件目录操作 os模块实现了平台无关的编程接口 创建文件 ```go package main import ( "fmt" "os" ) func main() { // 会覆盖原有文件 file, err := os.Create("demo.txt") if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Printf("file.Name(): %v\n", file.Name()) // file.Name(): demo.txt } } ``` 创建目录 ```go package main import ( "fmt" "os" ) func main() { // 权限777 err := os.Mkdir("demo", os.ModePerm) if err != nil { fmt.Printf("err: %v\n", err) } } ``` 创建多级目录 ```go package main import ( "fmt" "os" ) func main() { // 权限777 err := os.MkdirAll("a/b/demo", os.ModePerm) if err != nil { fmt.Printf("err: %v\n", err) } } ``` 移除文件或空目录 ```go package main import ( "fmt" "os" ) func main() { err := os.Remove("demo.txt") if err != nil { fmt.Printf("err: %v\n", err) } } ``` 移除目录下所有文件 ```go package main import ( "fmt" "os" ) func main() { err := os.RemoveAll("a") if err != nil { fmt.Printf("err: %v\n", err) } } ``` 工作目录 ```go package main import ( "fmt" "os" ) func main() { // 获取当前工作目录 dir, _ := os.Getwd() fmt.Printf("dir: %v\n", dir) // dir: /Users/mo/Desktop/go_code // 修改当前工作目录 os.Chdir("../") // 再次获取当前工作目录 dir, _ = os.Getwd() fmt.Printf("dir: %v\n", dir) // dir: /Users/mo/Desktop } ``` 获取临时目录 ```go package main import ( "fmt" "os" ) func main() { temp := os.TempDir() fmt.Printf("temp: %v\n", temp) // temp: /var/folders/43/llymqbps19d74q2h_bgb00mr0000gn/T/ } ``` 重命名文件 ```go package main import ( "fmt" "os" ) func main() { err := os.Rename("demo.txt", "demo.2.txt") if err != nil { fmt.Printf("err: %v\n", err) } } ``` ## os模块-文件读写操作 读取文件 ```go package main import ( "fmt" "os" ) func main() { content, err := os.ReadFile("demo.txt") if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Printf("content: %v\n", string(content[:])) // content: Hello World } } ``` 写文件 ```go package main import ( "fmt" "os" ) func main() { err := os.WriteFile("demo.txt", []byte("hello"), os.ModePerm) if err != nil { fmt.Printf("err: %v\n", err) } } ``` 打开现有文件 ```go package main import ( "fmt" "os" ) func main() { f, err := os.Open("demo.txt") if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Printf("f.Name(): %v\n", f.Name()) // f.Name(): demo.txt f.Close() } } ``` 如果不存在则创建 ```go package main import ( "fmt" "os" ) func main() { // 如果不存在则创建 f, err := os.OpenFile("demo.txt", os.O_RDWR|os.O_CREATE, os.ModePerm) if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Printf("f.Name(): %v\n", f.Name()) // f.Name(): demo.txt f.Close() } } ``` 其他方法 ```go // 等价于:OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) f, err := os.Create("demo.txt") // 创建临时文件 f, _ := os.CreateTemp("", "test") fmt.Printf("f.Name(): %v\n", f.Name()) // f.Name(): /var/folders/43/llymqbps19d74q2h_bgb00mr0000gn/T/test218970504 // 从指定字节数开始读取 n, err := f.ReadAt(buf, 3) // 定位光标 f.Seek(3, 0) ``` 按照字节数去取文件 ```go package main import ( "fmt" "io" "os" ) func main() { f, _ := os.Open("demo.txt") for { // 字节缓冲区 buf := make([]byte, 3) n, err := f.Read(buf) if err == io.EOF { break } fmt.Printf("n: %v\n", n) fmt.Printf("string(buf): %v\n", string(buf)) } f.Close() } ``` 遍历目录 ```go package main import ( "fmt" "os" ) func main() { dirs, _ := os.ReadDir("./") for _, dir := range dirs { // 判断是否是目录 fmt.Printf("dir: %v\n", dir.IsDir()) // 输出名称 fmt.Printf("dir: %v\n", dir.Name()) } } ``` 写入字节数组 ```go package main import ( "os" ) func main() { // 追加写入 f, _ := os.OpenFile("demo.txt", os.O_RDWR|os.O_APPEND, 0775) f.Write([]byte("hello")) f.Close() } ``` 写入字符串 ```go package main import ( "os" ) func main() { // 覆盖写入 f, _ := os.OpenFile("demo.txt", os.O_RDWR|os.O_TRUNC, 0775) f.WriteString("hello") f.Close() } ``` 指定起始点 ```go package main import ( "os" ) func main() { f, _ := os.OpenFile("demo.txt", os.O_RDWR, 0775) f.WriteAt([]byte("hello"), 3) f.Close() } ``` ## os模块-进程相关操作 示例 ```go package main import ( "fmt" "os" "time" ) func main() { // 获得当前进程id fmt.Printf("os.Getpid(): %v\n", os.Getpid()) // os.Getpid(): 92729 // 获得父进程id fmt.Printf("os.Getppid(): %v\n", os.Getppid()) // os.Getppid(): 92713 // 设置进程属性 attr := &os.ProcAttr{ // files指定新进程继承的活动文件对象 // 参数:标准输入、标准输出、标准错误输出 Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, // 新进程的环境变量 Env: os.Environ(), } // 开启新进程 (name string, argv []string, attr *ProcAttr) p, _ := os.StartProcess("/Users/user/Applications/golang/1.19/bin/go", []string{"/Users/user/Applications/golang/1.19/bin/go", "run", "hello.go"}, attr) fmt.Printf("p: %v\n", p) // p: &{94937 0 0 {{0 0} 0 0 0 0}} fmt.Printf("p.Pid: %v\n", p.Pid) // p.Pid: 94937 // 通过进程id查找进程 p2, _ := os.FindProcess(p.Pid) fmt.Printf("p2: %v\n", p2) // p2: &{95057 0 0 {{0 0} 0 0 0 0}} // 等待10秒执行函数 time.AfterFunc(time.Second*10, func() { // 向p进程发送退出信号 p.Signal(os.Kill) }) // 等待进程p 退出,返回进程状态 ps, _ := p.Wait() fmt.Printf("ps.String(): %v\n", ps.String()) // ps.String(): exit status 0 } ``` ## os模块-环境变量相关 示例 ```go package main import ( "fmt" "os" ) func main() { // 获取所有环境变量 s := os.Environ() fmt.Printf("s: %v\n", s) // 获取某个环境变量 s2 := os.Getenv("GOROOT") fmt.Printf("s2: %v\n", s2) // 设置环境变量 os.Setenv("GO_EVN_VAR", "go_evn_var") // 查找环境变量 s3, _ := os.LookupEnv("GO_EVN_VAR") fmt.Printf("s3: %v\n", s3) // s3: go_evn_var // 表达式替换 s4 := os.ExpandEnv("var: $GO_EVN_VAR") fmt.Printf("s4: %v\n", s4) // s4: var: go_evn_var // 清空环境变量 // os.Clearenv() } ```