Golang 中的文件读写 / Golang 中的文件处理


2022年1月30日, Learn eTutorial
2434

在本教程中,您将学习使用 os.File 的最基本技术。在 Go 中有几种方法可以用于文件操作。在本教程中,您将学习如何使用 Golang 创建、编辑、读取和删除文件。

在 Golang 中创建新文件

在 Go 中创建文件非常容易,只需调用 os.Create() 函数,然后输入您想要创建的文件的路径作为参数。如果待创建的文件已存在,它将被覆盖。可以使用 os.IsNotExist() 来检测文件是否已被创建。

以下是创建文件的示例。


package main

import (
    "fmt"
    "os"
)

var path = "C:/Users/Desktop/Golang/Tutorials/test.txt"

func isError(err error) bool {
    if err != nil {
        fmt.Println(err.Error())
    }

    return (err != nil)
}

func createFile() {
    // detect if the file already exists
    var _, err = os.Stat(path)

    // create a new file if it doesn't already exist
    if os.IsNotExist(err) {
        var file, err = os.Create(path)
        if isError(err) {
            return
        }
        defer file.Close()
    }

    fmt.Println("==> file created successfully", path)
}

func main() {
    createFile()
}

输出


PS C:\Users\Desktop\Golang> go run file.go
==> file created successfully C:/Users/Desktop/Golang/Tutorials/test.txt
PS C:\Users\Desktop\Golang>

os.Stat() 函数返回两个数据,即关于被搜索路径的信息和一个错误(如果有)。将函数的返回错误作为 os.IsNotExist() 函数的参数,以检测待创建的文件是否已存在。如果不存在,该函数将返回 true。

os.Create() 函数用于在指定路径创建文件。该函数返回相应文件的 *os.File 对象。新创建的文件状态自动为打开,因此在文件不再使用后需要使用 file.Close() 方法关闭它。

当文件不再使用时保持其打开状态不是一个好习惯,因为它会影响内存和对文件本身的访问。只要文件状态仍为打开或未关闭,文件将被锁定,从而无法被其他进程使用。

在 Golang 中编辑文件内容

要编辑文件,首先需要以写访问级别打开一个文件。获取文件对象后,使用 WriteString() 方法填充数据。最后,调用 Sync() 方法保存更改。

编辑文件内容的程序


package main

import (
    "fmt"
    "os"
)

var path = "C:/Users/Desktop/Golang/Tutorials/test.txt"

func writeFile() {
    // open file with access level READ & WRITE
    var file, err = os.OpenFile(path, os.O_RDWR, 0644)
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // write data to file
    _, err = file.WriteString("hello\n")

    if err != nil {
        panic(err)
    }
    _, err = file.WriteString(" golang\n")
    if err != nil {
        panic(err)
    }

    // save changes
    err = file.Sync()
    if err != nil {
        panic(err)
    }

    fmt.Println("==> file successful")
}

func main() {
    writeFile()
}

输出


PS C:\Users\Desktop\Golang> go run file.go
==> file successful
GO : Files

在上面的程序中,文件以读写访问级别和权限代码 0664 打开。之后,使用 WriteString() 将一些字符串输入到文件中。最后,通过调用 Sync() 保存对文件的所有更改。

在 Golang 中读取文件内容

要读取的文件必须首先使用 os.OpenFile() 函数以最低为读的访问级别打开。之后,使用 Read() 方法,其参数是一个变量,读取过程的结果将保存到该变量中。

读取文件内容的程序


package main

import (
    "fmt"
    "io"
    "os"
)

var path = "C:/Users/Desktop/Golang/Tutorials/test.txt"

func readFile() {
    // open file
    var file, err = os.OpenFile(path, os.O_RDONLY, 0644)
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // read file
    var text = make([]byte, 1024)
    for {
        n, err := file.Read(text)
        if err != io.EOF {
            if err != nil {
                panic(err)
            }
        }
        if n == 0 {
            break
        }
    }
    if err != nil {
        panic(err)
    }

    fmt.Println("==> file read successfully")
    fmt.Println(string(text))
}

func main() {
    readFile()
}

输出


PS C:\Users\Desktop\Golang> go run readfile.go
==> file read successfully
hello
 golang

上面的代码 os.OpenFile() 用于打开文件。该函数有几个参数。

第一个参数是要打开的文件的路径。
第二个参数是访问级别。os.O_RDONLY 表示只读。
第三个参数是文件权限。
text 变量以 slice []byte 类型准备,并分配了 1024 个元素。该变量负责容纳 file.Read() 语句产生的数据。读取文件的过程将持续进行,从第一行顺序读取到最后。

执行 file.Read() 时出现的错误将被过滤,当错误不是 io.EOF 时,文件读取过程将继续。io.EOF 错误本身表示正在读取的文件是内容的最后一行或文件末尾。

在 Golang 中删除文件

删除文件的方法非常简单,只需调用 os.Remove() 函数,并输入您要删除的文件的路径作为参数即可。


package main

import (
 "fmt"
 "os"
)

var path = "C:/Users/Desktop/Golang/Tutorials/test.txt"

func deleteFile() {
 var err = os.Remove(path)
 if err != nil {
  panic(err)
 }

 fmt.Println("==> file deleted successfully")
}

func main() {
 deleteFile()
}


输出


Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.

PS C:\Users\Desktop\Golang> go run delfile.go
==> file deleted successfully