用Golang进行读、写和截断文件的操作

364 阅读1分钟

在这个例子中,我们将看到Golang的一些非常基本的文件操作。它包括,读、写和截断。它将是一个单独的或组合的操作。

main.go

package main

import (
	"fmt"
	"log"

	"github.com/you/client/file"
)

func main() {
	lines, err := file.ReadContentLineByLineIntoSlice("./file-1.txt")
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(lines)

	err = file.CreateAndWriteContent("./file-2.txt")
	if err != nil {
		log.Fatalln(err)
	}

	err = file.OpenReadAndAppendContent("./file-3.txt")
	if err != nil {
		log.Fatalln(err)
	}

	err = file.OpenReadAndReplaceContent("./file-4.txt")
	if err != nil {
		log.Fatalln(err)
	}
}

file.go

package file

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

// Open a file for read only and read line by line into a slice.
func ReadContentLineByLineIntoSlice(path string) ([]string, error) {
	var lines []string

	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		if scanner.Text() != "" {
			lines = append(lines, scanner.Text())
		}
	}
	if err := scanner.Err(); err != nil {
		return nil, err
	}

	return lines, nil
}

// Create a file if it does not exists, open for write only and write to it.
// It replaces the content if the file was already existed and full.
func CreateAndWriteContent(path string) error {
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0600)
	if err != nil {
		return err
	}
	defer file.Close()

	writer := bufio.NewWriter(file)
	for i := 0; i <= 5; i++ {
		// Version 1
		// if _, err := writer.WriteString(fmt.Sprintf("%d\n", i)); err != nil {
		// 	return err
		// }

		// Version 2
		if _, err := fmt.Fprintf(writer, "%d\n", i); err != nil {
			return err
		}
	}
	if err := writer.Flush(); err != nil {
		return err
	}

	return nil
}

// Open an existing file to read it first and append the content at the end.
func OpenReadAndAppendContent(path string) error {
	file, err := os.OpenFile(path, os.O_RDWR, 0600)
	if err != nil {
		return err
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		if scanner.Text() != "" {
			fmt.Println(scanner.Text())
		}
	}
	if err := scanner.Err(); err != nil {
		return err
	}

	if _, err := fmt.Fprintf(file, "last\n"); err != nil {
		return err
	}

	return nil
}

// Open an existing file to read it first and replace the content.
func OpenReadAndReplaceContent(path string) error {
	file, err := os.OpenFile(path, os.O_RDWR, 0600)
	if err != nil {
		return err
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		if scanner.Text() != "" {
			fmt.Println(scanner.Text())
		}
	}
	if err := scanner.Err(); err != nil {
		return err
	}

	if err := file.Truncate(0); err != nil {
		return err
	}
	if _, err := file.Seek(0, 0); err != nil {
		return err
	}
	if _, err := fmt.Fprint(file, time.Now().Format(time.RFC3339)); err != nil {
		return err
	}

	return nil
}