使用带缓冲区的方式读取文件
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
}