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('\n')    // 循环读取一行
        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\n", 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\n", err)
        return
    }
    fmt.Printf("%s\n", 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('\n')
        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.\n"
    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
}
复制代码

 

相关文章
|
6月前
|
Go API
一文搞懂Go读写Excel文件
一文搞懂Go读写Excel文件
165 0
|
19天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
21天前
|
算法 大数据 Go
Go文件操作:掌握Go的文件读写与操作技巧
本文介绍了Go语言的文件操作功能,包括文件的打开、读写和关闭。Go语言通过`os`和`io`包提供了丰富的文件操作接口,使开发者能够轻松实现文件的读写和管理。文章详细讲解了核心概念、具体操作步骤和代码示例,并探讨了实际应用场景和未来发展趋势。
|
21天前
|
存储 前端开发 Go
Go 文件的读取操作
本文介绍了 Go 语言标准库中的 `os` 包和 `bufio` 包,重点讲解了 `os` 包中的 `Open` 和 `OpenFile` 函数及 `File` 结构体的 `Read` 方法,以及 `bufio` 包中的 `NewReader` 函数和 `Reader` 结构体的 `ReadString` 方法。通过示例代码展示了如何使用这些方法高效读取文件,减少磁盘操作。
|
1月前
|
存储 Go 文件存储
M.2移动硬盘打造Win To Go系统:高效分区存储文件全攻略
【10月更文挑战第12天】本文详细介绍了如何使用M.2移动硬盘制作Win To Go系统。首先,需准备合适容量与接口类型的M.2硬盘及硬盘盒,并获取Windows镜像文件和分区工具。接着,通过Rufus软件将镜像写入硬盘。文中还提供了分区策略,包括系统分区(约80-120GB)、软件分区(根据需求设定)和数据分区(剩余空间),并指导如何使用DiskGenius或Windows自带工具进行分区。最后,强调了对各分区文件的有效管理和定期备份的重要性。
|
1月前
|
存储 固态存储 Go
M.2移动硬盘打造Win To Go系统:高效分区存储文件全攻略
【10月更文挑战第11天】Win To Go 是一种将 Windows 系统安装在 M.2 移动硬盘上的技术,便于用户携带自定义系统跨设备使用。需准备高性能 M.2 硬盘及合适硬盘盒,并使用 DiskGenius 或 Rufus 进行分区与系统安装。系统分区用于安装 Windows,其余分区可根据需求存储工作或娱乐文件,便于管理和备份。
140 2
|
2月前
|
Go
Go to Learn Go之文件操作
Go to Learn Go之文件操作
28 8
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记
|
3月前
|
机器学习/深度学习 移动开发 Linux
Go从入门到放弃之文件操作
Go从入门到放弃之文件操作
|
3月前
|
XML 设计模式 JSON
Go - 关于 proto 文件的一点小思考?
Go - 关于 proto 文件的一点小思考?
46 0