zoukankan      html  css  js  c++  java
  • Go语言学习笔记(五)文件操作

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959

    文件读取

    os.File 封装了文件相关操作

     os.File Pkg Doc

    读写参数

    文件打开模式:

    const (
        O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
        O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
        O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
        O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
        O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
        O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
        O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
        O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
    )

    权限控制:

    r ——> 004
    w ——> 002
    x ——> 001

    读取栗子

    os.Open || os.OpenFile
    package main
    
    import (
        "bufio"
        "fmt"
        "os"
    )
    
    func main() {
        // file, err := os.Open("/tmp/test")
        file, err := os.OpenFile("/tmp/test", os.O_CREATE|os.O_WRONLY, 0666)
        if err != nil {
            fmt.Println("Open file error: ", err)
            return
        }
        defer file.Close()    //关闭文件
    
        reader := bufio.NewReader(file)    //带缓冲区的读写
        for {
            str, err := reader.ReadString('
    ')    // 循环读取一行
            if err != nil {
                fmt.Println("read string failed, err: ", err)
                return
            }
            fmt.Println("read string is %s: ", str)
        }
    }

    readline

    package main
    
    import (
        "bufio"
        "fmt"
        "io"
        "os"
    )
    
    func main() {
        file, err := os.Open("C:/test.log")
        if err != nil {
            fmt.Println(err)
            return
        }
        defer file.Close()
        reader := bufio.NewReader(file)
        var line []byte
        for {
            data, prefix, err := reader.ReadLine()
            if err == io.EOF {
                break
            }
    
            line = append(line, data...)
            if !prefix {
                fmt.Printf("data:%s
    ", string(line))
                line = line[:]
            }
    
        }
    }

    读取整个文件栗子

    "io/ioutil" 包实现了读取整个文件功能

    package main
    
    import (
        "fmt"
        "os"
        "io/ioutil"
    )
    
    func main() {
        fileName := "/tmp/test"
    
        file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666)
        if err != nil {
            fmt.Println("Open file error: ", err)
            return
        }
        defer file.Close()
    
        buf, err := ioutil.ReadAll(file)
        //buf, err := ioutil.ReadFile(fileName)
        if err != nil {
            fmt.Fprintf(os.Stderr, "File Error: %s
    ", err)
            return
        }
        fmt.Printf("%s
    ", string(buf))
    }

    读取压缩文件栗子

    "compress/*" 包实现压缩文件功能。

    "compress/gzip" 包实现了gzip格式压缩文件的读写 

    package main
    
    import (
        "bufio"
        "compress/gzip"
        "fmt"
        "os"
    )
    
    func main() {
        fileName := "/tmp/test.log.gz"
    
        var r *bufio.Reader
    
        fi, err := os.Open(fileName)
        if err != nil {
            fmt.Println("error", err)
            os.Exit(1)
        }
    
        fz, err := gzip.NewReader(fi)
        if err != nil {
            fmt.Println("error", err)
            return
        }
    
        r = bufio.NewReader(fz)
        for {
            line, err := r.ReadString('
    ')
            if err != nil {
                fmt.Println("Done reading file")
                return
            }
            fmt.Println(line)
        }
    }

    文件写入

    file.WriteString || file.Write

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        fileName := "/tmp/test_write"
    
        file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
        if err != nil {
            fmt.Println("error", err)
            os.Exit(1)
        }
        defer file.Close()
    
        fileString := "Today very happy."
        file.Seek(0, 2)    // 最后增加
        file.WriteString(fileString)
        //file.Write([]byte(fileString))
    }

    bufio.Writer.WriteString

    带缓冲的写,最后要将缓冲中的数据写入下层的io.Writer接口(Flush方法)

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
    )
    
    func main() {
        fileName := "/tmp/test_write"
    
        file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
        if err != nil {
            fmt.Println("error", err)
            os.Exit(1)
        }
        defer file.Close()
    
        fileWrite := bufio.NewWriter(file)
        fileString := "good.
    "
        for i := 0; i < 10; i++ {
            fileWrite.WriteString(fileString)
        }
        fileWrite.Flush()
    }

    拷贝文件栗子

    从一个文件拷贝到另一个文件

    package main
    
    import (
        "fmt"
        "io"
        "os"
    )
    
    func CopyFile(dstName, srcName string) (writeen int64, err error) {
        src, err := os.Open(dstName)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer src.Close()
    
        dst, err := os.OpenFile(srcName, os.O_CREATE|os.O_WRONLY, 0644)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer dst.Close()
    
        return io.Copy(dst, src)
    }
    
    func main() {
        CopyFile("/tmp/test", "/tmp/test_copy1")
        fmt.Println("copy done.")
    }

    栗子

    判断文件或文件夹是否存在

    func PathExists(path string) (bool, error) {
        /*
        判断文件或文件夹是否存在
        如果返回的错误为nil,说明文件或文件夹存在
        如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
        如果返回的错误为其它类型,则不确定是否在存在
        */
        _, err := os.Stat(path)
        if err == nil {
            return true, nil
        }
        if os.IsNotExist(err) {
            return false, nil
        }
        return false, err
    }
  • 相关阅读:
    VC环境OpenSSL编译笔记
    手动造工具TaskJobManage
    Java性能分析工具
    ES77
    Flink消费kafka
    阻塞对列
    C# 超时事件
    毕业前做一件事
    PID控制器——控制网络爬虫速度
    2.5 OpenEuler 中C与汇编的混合编程(选做)
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8547498.html
Copyright © 2011-2022 走看看