文件是什么?

计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。

打开文件

func Open(name string) (*File, error)
func main() {
    // 打开文件
    file, err := os.Open("./panghu.txt")
    if err != nil {
        fmt.Printf("open file failed err: %v \n", err)
        return
    }
    // 关闭文件
    defer file.Close()
}

写入内容

打开文件

func OpenFile(name string, flag int, perm FileMode) (*File, error)
os.O_RDONLY     //只读
os.O_WRONLY     //只写
os.O_RDWR       //读写文件
os.O_APPEND     //追加文件
os.O_CREATE     //不存在时创建文件
os.O_TRUNC      //打开时截断文件
func main() {
    file, err := os.OpenFile("./panghu.txt", os.O_CREATE | os.O_APPEND | os.O_RDWR, 0666)
    if err != nil {
        fmt.Printf("open file failed err: %v \n", err)
        return
    }
    // 延迟关闭
    defer file.Close()
    n, err2 := file.WriteString("ok panghu!")
    if err2 != nil {
        fmt.Printf("WriteString failed err: %v \n", err)
        return
    }
    fmt.Println(n)
}

读取文件

func Read(fd Handle, p []byte) (n int, err error)
func main() {
    file, err := os.OpenFile("./panghu.txt", os.O_CREATE | os.O_APPEND | os.O_RDWR, 0666)
    if err != nil {
        fmt.Printf("open file failed err: %v \n", err)
        return
    }
    defer file.Close()

    var tmp = make([]byte, 128)
    n, err2 := file.Read(tmp)    // n读取了多少字节
    if err2 != nil {
        fmt.Printf("read file failed err: %v \n", err)
        return
    }
    fmt.Println(n, string(tmp[:n]))
}

读取文件全部数据

使用for循环读取

func main() {
    file, err := os.Open("./panghu.txt")
    if err != nil {
        fmt.Printf("open file failed err: %v \n", err)
        return
    }
    defer file.Close()

    var tmp = make([]byte, 128)
    var context []byte
    for {
        n, err := file.Read(tmp)
        if err == io.EOF {
            fmt.Println("文件读取完毕!")
            break
        }
        if err != nil {
            fmt.Printf("Read file failed err: %v \n", err)
            return
        }
        fmt.Println(n)
        context = append(context, tmp[:n]...) // ... 拆开放入
    }
    fmt.Println(string(context[:]))
}

bufio

按行读取内容 有缓冲

func main() {
    file, err := os.Open("./panghu.txt")
    if err != nil {
        fmt.Printf("open file failed err: %v \n", err)
        return
    }
    defer file.Close()

    reader := bufio.NewReader(file)
    for {
        line, err2 := reader.ReadString('\n')
        if err2 == io.EOF {
            fmt.Println("已读取完毕")
            break
        }
        if err2 != nil {
            fmt.Printf("readerString file err: %v", err)
            return
        }
        fmt.Println(line)
    }
}

ioutil

读取文件全部内容

func main() {
    txt, err := ioutil.ReadFile("./panghu.txt")
    if err != nil {
        fmt.Println("读取错误: ", err)
        return
    }
    fmt.Println(string(txt))
}

文件写入

Write、WriteString

func main() {
    file, err := os.OpenFile("./a.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
    if err != nil {
        fmt.Printf("open file failed err: ", err)
        return
    }
    file.Write([]byte("hello \n"))
    file.WriteString("hello world \n")
}

bufio.NewWriter

func main() {
    file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    if err != nil {
        fmt.Println("open file failed, err:", err)
        return
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        writer.WriteString("hello\n") //将数据先写入缓存
    }
    writer.Flush() //将缓存中的内容写入文件
}

ioutil.WriteFile

func main() {
    str := "hello"
    err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
    if err != nil {
        fmt.Println("write file failed, err:", err)
        return
    }
}

检测文件是否存在

func main() {
    fileInfo, err := os.Stat("./a.txt")
    if err != nil {
        if os.IsNotExist(err) {
            // 文件不存在
            log.Fatal("File does not exist.")
        }
        fmt.Println("err: ", err)
        return
    }
    // 文件大小
    fmt.Println(fileInfo.Size())
    // 文件名称
    fmt.Println(fileInfo.Name())
    // 修改时间
    fmt.Println(fileInfo.ModTime())
}

修改文件权限、改变时间戳

func main() {
   err := os.Chmod("./a.txt", 777)
   if err != nil {
       fmt.Println(err)
   }

   //改变时间戳
   twoDaysFromNow := time.Now().Add(48 * time.Hour)
   lastAccessTime := twoDaysFromNow
   lastModifyTime := twoDaysFromNow
   err = os.Chtimes("./a.txt", lastAccessTime, lastModifyTime)
   if err != nil {
       log.Println(err)
   }
}

移除文件

func main() {
    err := os.Remove("a.txt")
    if err != nil {
        fmt.Println(err)
    }
}