Go语言学习之旅--文件OS

Posted 赵jc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言学习之旅--文件OS相关的知识,希望对你有一定的参考价值。

Go语言学习之旅--文件


博客根据B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货》视频整理的,如有错误请大家评论指正!

os库

os库:https://pkg.go.dev/

OS文件、目录操作

package main

import (
    "fmt"
    "os"
)

// 创建文件
func createFile() 
    f, err := os.Create("test.txt")
    if err != nil 
        fmt.Printf("err: %v\\n", err)
     else 
        fmt.Printf("f: %v\\n", f)
    


// 创建目录
func createDir() 
    // 创建单个目录
    /* err := os.Mkdir("test", os.ModePerm)
    if err != nil 
        fmt.Printf("err: %v\\n", err)
     */
    err := os.MkdirAll("test/a/b", os.ModePerm)
    if err != nil 
        fmt.Printf("err: %v\\n", err)
    


// 删除目录
func removeDir() 
    /* err := os.Remove("test.txt")
    if err != nil 
        fmt.Printf("err: %v\\n", err)
     */

    err := os.RemoveAll("test")
    if err != nil 
        fmt.Printf("err: %v\\n", err)
    


// 获得工作目录
func getWd() 
    dir, err := os.Getwd()
    if err != nil 
        fmt.Printf("err: %v\\n", err)
     else 
        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("b: %v\\n", string(b[:]))
    


// 写文件
func writeFile() 
    s := "hello world"
    os.WriteFile("test2.txt", []byte(s), os.ModePerm)


func main() 
    // createFile()
    // createDir()
    // removeDir()
    // removeDir()
    // getWd()
    // chWd()
    // renameFile()
    // readFile()
    // writeFile()
    // getTemp()

File文件读操作

package main
 
import (
    "fmt"
    "os"
)
 
// 打开关闭文件
func openCloseFile() 
    // 只能读
    f, _ := os.Open("a.txt")
    fmt.Printf("f.Name(): %v\\n", f.Name())
    // 根据第二个参数 可以读写或者创建
    f2, _ := os.OpenFile("a1.txt", os.O_RDWR|os.O_CREATE, 0755)
    fmt.Printf("f2.Name(): %v\\n", f2.Name())
 
    err := f.Close()
    fmt.Printf("err: %v\\n", err)
    err2 := f2.Close()
    fmt.Printf("err2: %v\\n", err2)

 
// 创建文件
func createFile() 
    // 等价于:OpenFile(name, O_RDWF|O_CREATE|O_TRUNK, 0666)
    f, _ := os.Create("a2.txt")
    fmt.Printf("f.Name(): %v\\n", f.Name())
    // 第一个参数 目录默认:Temp 第二个参数 文件名前缀
    f2, _ := os.CreateTemp("", "temp")
    fmt.Printf("f2.Name(): %v\\n", f2.Name())

 
// 读操作
func readOps() 
    // 循环读取
    /* f, _ := os.Open("a.txt")
    for 
        buf := make([]byte, 6)
        n, err := f.Read(buf)
        fmt.Printf("string(buf): %v\\n", string(buf))
        fmt.Printf("n: %v\\n", n)
        if err == io.EOF 
            break
        
    
    f.Close() */
 
    /* buf := make([]byte, 10)
    f2, _ := os.Open("a.txt")
    // 从5开始读10个字节
    n, _ := f2.ReadAt(buf, 5)
    fmt.Printf("n: %v\\n", n)
    fmt.Printf("string(buf): %v\\n", string(buf))
    f2.Close() */
 
    // 测试 a目录下有b和c目录
    /* f, _ := os.Open("a")
    de, _ := f.ReadDir(-1)
    for _, v := range de 
        fmt.Printf("v.IsDir(): %v\\n", v.IsDir())
        fmt.Printf("v.Name(): %v\\n", v.Name())
     */
 
    // 定位
    f, _ := os.Open("a.txt")
    f.Seek(3, 0)
    buf := make([]byte, 10)
    n, _ := f.Read(buf)
    fmt.Printf("n: %v\\n", n)
    fmt.Printf("string(buf): %v\\n", string(buf))
    f.Close()

 
func main() 
    // openCloseFile()
    // createFile()
    readOps()

File文件写操作

package main 
 
import ( 
    "os" 
) 
 
// 写字节数组 
func write()  
    f, _ := os.OpenFile("a.txt", os.O_RDWR|os.O_APPEND, 0775) 
    f.Write([]byte("hello golang")) 
    f.Close() 
 
 
// 写字符串 
func writeString()  
    f, _ := os.OpenFile("a.txt", os.O_RDWR|os.O_TRUNC, 0775) 
    f.WriteString("hello world...") 
    f.Close() 
 
 
// 随机写 
func writeAt()  
    f, _ := os.OpenFile("a.txt", os.O_RDWR, 0775) 
    f.WriteAt([]byte("aaa"), 3) 
    f.Close() 
 
 
func main()  
    // write() 
    // writeString() 
    writeAt() 
 
 

os包进程相关操作

package main 
 
import ( 
    "fmt" 
    "os" 
    "time" 
) 
 
func main()  
    // 获得当前正在运行的进程id 
    fmt.Printf("os.Getegid(): %v\\n", os.Getegid()) 
    // 父id 
    fmt.Printf("os.Getegid(): %v\\n", os.Getegid()) 
 
    // 设置新进程的属性 
    attr := &os.ProcAttr 
        // files指定新进程继承的活动文件对象 
        // 前三个分别为,标准输入、标准输出、标准错误输出 
        Files: []*os.Fileos.Stdin, os.Stdout, os.Stderr, 
        // 新进程的环境变量 
        Env: os.Environ(), 
     
 
    // 开始一个新进程 
    p, err := os.StartProcess("c:\\\\windows\\\\system32\\\\notepad.exe", []string"c:\\\\windows\\\\system32\\\\notepad.exe", "d:\\\\a.txt", attr) 
    if err != nil  
        fmt.Println(err) 
     
    fmt.Println(p) 
    fmt.Println("进程ID:", p.Pid) 
 
    // 通过进程ID查找进程 
    p2, _ := os.FindProcess(p.Pid) 
    fmt.Println(p2) 
 
    // 等待10秒,执行函数 
    time.AfterFunc(time.Second*10, func()  
        // 向p进程发出退出信号 
        p.Signal(os.Kill) 
    ) 
 
    // 等待进程p的退出,返回进程状态 
    ps, _ := p.Wait() 
    fmt.Println(ps.String()) 
 
 

os包和环境相关的方法

package main
 
import (
    "fmt"
    "os"
)
 
func main() 
    // 获得所有环境变量
    s := os.Environ()
    fmt.Printf("s: %v\\n", s)
    // 获得某个环境变量
    s2 := os.Getenv("GOPATH")
    fmt.Printf("s2: %v\\n", s2)
    // 设置环境变量
    os.Setenv("env1", "env1")
    s2 = os.Getenv("aaa")
    fmt.Printf("s2: %v\\n", s2)
    fmt.Println("--------------")
 
    // 查找
    s3, b := os.LookupEnv("env")
    fmt.Printf("b: %v\\n", b)
    fmt.Printf("s3: %v\\n", s3)
 
    // 替换
    os.Setenv("NAME", "gopher")
    os.Setenv("BURROW", "/usr/gopher")
 
    os.ExpandEnv("$NAME lives in $BURROW.")
 
    // 清空环境变量
    // os.Clearenv()

以上是关于Go语言学习之旅--文件OS的主要内容,如果未能解决你的问题,请参考以下文章

Go语言学习之旅--文件OS

go语言os怎么创建文件后格式化显示

go语言学习之旅--Go 语言环境安装

Go语言学习之旅--初识GoLang

Go语言学习之旅--并发编程

Go语言学习之旅--并发编程