使用带缓冲区的方式读取文件

package main

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

func main() {
	file, err := os.Open("/Users/shang/Downloads/test.txt")
	if err != nil {
		fmt.Printf("open file error:%v\n", err)
		return
	}
	// 函数结束前关闭文件
	defer file.Close()
	fmt.Printf("file:%v\n", file)

	// 默认缓冲区4096字节
	reader := bufio.NewReader(file)
	for {
		readString, err := reader.ReadString('\n')
		if err != nil {
			if err == io.EOF {
				fmt.Println("读文件结束")
				break
			} else {
				fmt.Printf("read string error:%v\n", err)
				return
			}
		}
		fmt.Print(readString)
	}
	fmt.Println()
	/*
		err = file.Close()
		if err != nil {
			fmt.Printf("close file error:%v\n", err)
		} else {
			fmt.Println("close file success")
		}
	*/
}

一次性读取文件内容

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	filePath := "/Users/shang/Downloads/test.txt"
	// 一次性读取文件内容,适合文件不大的情况。没有显式打开文件,不用关闭文件。open close已封装到ReadFile函数中
	content, err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Printf("read file error:%v\n", err)
		return
	}
	fmt.Println(string(content))
}

写文件

func main() {
	file, err := os.OpenFile("/Users/shang/Downloads/test1.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Printf("OpenFile err:%v\n", err)
		return
	}
	defer file.Close()
	str := "Hello world"
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		writer.WriteString(str + "\n")
	}
	// writer带缓存,需要刷到磁盘
	writer.Flush()


	// 读取file1的内容,将内容写入到file2
	file1 := "/Users/shang/Downloads/test1.txt"
	file2 := "/Users/shang/Downloads/test2.txt"
	data, err := ioutil.ReadFile(file1)
	if err != nil {
		fmt.Printf("read file err:%v\n", err)
		return
	}
	err = ioutil.WriteFile(file2, data, 0666)
	if err != nil {
		fmt.Printf("write file err:%v\n", err)
		return
	}
}

/*
const (
	// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
	O_RDONLY int = syscall.O_RDONLY // open the file read-only.
	O_WRONLY int = syscall.O_WRONLY // open the file write-only.
	O_RDWR   int = syscall.O_RDWR   // open the file read-write.
	// The remaining values may be or'ed in to control behavior.
	O_APPEND int = syscall.O_APPEND // append data to the file when writing.
	O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
	O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist.
	O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.
	O_TRUNC  int = syscall.O_TRUNC  // truncate regular writable file when opened.
)
*/

判断文件或目录是否存在

func main() {
	path := "/Users/shangyidong/Downloads1"
	exist, err := PathExist(path)
	fmt.Println("exist:", exist)
	fmt.Println("err:", err)
}

func PathExist(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		fmt.Println(path, "文件或目录存在")
		return true, nil
	}
	if os.IsNotExist(err) {
		fmt.Println(path, "目录不存在1")
		return false, err
	}
	fmt.Println(path, "目录不存在2")
	return false, err
}