欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Go基础编程实践(六)—— 文件

程序员文章站 2022-03-26 12:15:29
检查文件是否存在 在此程序同目录下创建log.txt文件,以检测。 检查文件是否不存在 读取文件内容 在此程序同目录下创建name.txt文件,以检测。 写入文件 在此程序同目录下创建hello_world文件。 创建临时文件 计算文件行数 在程序同目录下创建"names.txt"文件,随便写几行字 ......

检查文件是否存在

在此程序同目录下创建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())
    }
}