Go基础编程实践—— 文件

Posted gaiheilukamei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go基础编程实践—— 文件相关的知识,希望对你有一定的参考价值。

检查文件是否存在

在此程序同目录下创建log.txt文件,以检测。

package main

import (
    "os"
    "fmt"
)

func main() 
    if _, err := os.Stat("log.txt"); err  == nil 
        fmt.Println("Log.txt file exists")
    

检查文件是否不存在

package main

import (
    "os"
    "fmt"
)

func main() 
    // IsNotExist函数定义:func IsNotExist(err error) bool
    // 返回一个布尔值说明该错误是否表示一个文件或目录不存在
    if _, err := os.Stat("log.txt"); os.IsNotExist(err) 
        fmt.Println("Log.txt file does not exist")
     else 
        fmt.Println("Log.txt file exists")
    

读取文件内容

在此程序同目录下创建name.txt文件,以检测。

package main

import (
    "io/ioutil"
    "fmt"
)

func main() 
    contentBytes, err := ioutil.ReadFile("name.txt")
    if err == nil 
        // ReadFile返回[]byte
        fmt.Println(string(contentBytes))
    

写入文件

在此程序同目录下创建hello_world文件。

package main

import (
    "io/ioutil"
    "fmt"
)

func main() 
    hello := "Hello, World"
    // WriteFile接受三个参数,要写入的文件名,写入的[]byte,以及写入权限
    err := ioutil.WriteFile("hello_world", []byte(hello), 0644)
    if err != nil 
        fmt.Println(err)
    

创建临时文件

package main

import (
    "io/ioutil"
    "fmt"
)

func main() 
    helloWorld := "Hello, World"
    // TempFile定义:func TempFile(dir, prefix string) (f *os.File, err error)
    // 在dir目录下创建一个新的、使用prefix为前缀的临时文件,
    // 以读写模式打开该文件并返回os.File指针。
    file, err := ioutil.TempFile("", "hello_world_temp")
    if err != nil 
        panic(err)
    
    // defer os.Remove(file.Name())
    if _, err := file.Write([]byte(helloWorld)); err != nil 
        panic(err)
    
    fmt.Println(file.Name())

计算文件行数

在程序同目录下创建"names.txt"文件,随便写几行字。

package main

import (
    "os"
    "bufio"
    "fmt"
)

func main() 
    file, _ := os.Open("names.txt")
    fileScanner := bufio.NewScanner(file)
    lineCount := 0
    for fileScanner.Scan() 
        lineCount++
    
    defer file.Close()
    fmt.Println(lineCount)

读取文件特定行

package main

import (
    "os"
    "bufio"
    "fmt"
)

func main() 
    fmt.Println(readLine(2))


func readLine(lineNumber int) string 
    file, _ := os.Open("names.txt")
    fileScanner := bufio.NewScanner(file)
    lineCount := 0
    for fileScanner.Scan() 
        if lineCount == lineNumber 
            return fileScanner.Text()
        
        lineCount++
    
    defer file.Close()
    return ""

比较两个文件的内容

package main

import (
    "fmt"
    "io/ioutil"
    "bytes"
)

func main() 
    one, err := ioutil.ReadFile("one.txt")
    if err != nil 
        panic(err)
    
    two, err2 := ioutil.ReadFile("two.txt")
    if err2 != nil 
        panic(err2)
    
    // Equal返回bool值
    same := bytes.Equal(one, two)
    fmt.Println(same)

删除文件

package main

import "os"

func main() 
    err := os.Remove("new.txt")
    if err != nil 
        panic(err)
    

复制或移动文件

package main

import (
    "os"
    "io"
)

func main() 
    original, err := os.Open("original.txt")
    if err != nil 
        panic(err)
    
    defer original.Close()
    original_copy, err2 := os.Create("copy.txt")
    if err2 != nil 
        panic(err2)
    
    defer original_copy.Close()
    // Copy(1, 2) -> 把2拷贝到1
    _, err3 := io.Copy(original_copy, original)
    if err3 != nil 
        panic(err3)
    

// 移动文件:拷贝之后利用os.Remove()删除原文件

重命名文件

package main

import "os"

func main() 
    os.Rename("old.txt", "new.txt")

删除目录及文件

package main

import (
    "os"
    "fmt"
)

func main() 
    // Remove无法删除非空文件夹,RemoveAll可以
    err := os.RemoveAll("hello")
    if err != nil 
        panic(err)
    

列出目录下所有文件

创建一个hello文件夹,在文件夹内创建两个文件,main文件和hello文件夹并列。

.
├── hello
│   ├── 1.txt
│   └── 2.txt
└── main.go
package main

import (
    "io/ioutil"
    "fmt"
)

func main() 
    files, err := ioutil.ReadDir("hello")
    if err != nil 
        panic(err)
    
    for _, f := range files 
        fmt.Println(f.Name())
    

以上是关于Go基础编程实践—— 文件的主要内容,如果未能解决你的问题,请参考以下文章

Go基础编程实践—— 数据库

Go基础编程实践——字符串

Go基础编程实践—— Map和数组

编程实践Go 语言手册《Go极简教程》

编程实践用 go 语言实现Bloom filter算法

编程实践Go Web开发:使用Gin快速实现一个HTTP接口