一些文件操作的常量
const (
// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
O_RDONLY int = syscall.O_RDONLY // 只读
O_WRONLY int = syscall.O_WRONLY // 只写
O_RDWR int = syscall.O_RDWR // 读写
// The remaining values may be or'ed in to control behavior.
O_APPEND int = syscall.O_APPEND // 往后追加
O_CREATE int = syscall.O_CREAT // 创建文件,如果不存在
O_EXCL int = syscall.O_EXCL // 文创建文件与create一起用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 同步IO操作
O_TRUNC int = syscall.O_TRUNC // 清空文件
)
文件的读取操作
基本读取
读取同目录下的test.txt文件
func file() {
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
defer file.Close()
if err != nil{
fmt.Println(err.Error())
return
}
for {
b := make([]byte,10)
read, err := file.Read(b)
if err != nil{
return
}
fmt.Print(string(b[:read]))
}
}
用带有缓存的reader读取
func file() {
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
defer file.Close()
if err != nil{
fmt.Println(err.Error())
return
}
reader:= bufio.NewReader(file)
for {
line, _, err := reader.ReadLine()
if err != nil {
return
}
fmt.Println(string(line))
}
}
文件夹的读取
文件夹接口的封装
type DirEntry interface {
Name() string
IsDir() bool
Type() FileMode
Info() (FileInfo, error)
}
例子
读取当前目录下文件夹中的内容
func file() {
dir, err := os.ReadDir("./")
if err != nil {
return
}
for _,v := range dir {
fmt.Println(v.Info())
fmt.Println(v.Name())
fmt.Println(v.IsDir())
fmt.Println(v.Type())
}
}
结果部分截图如下:
文件的写操作
基本
向同目录下的test.txt文件末尾写入hello world
func file() {
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
defer file.Close()
if err != nil{
fmt.Println(err)
return
}
file.Seek(0,io.SeekEnd)
file.Write([]byte("hello world"))
}
使用带有缓存的writer写
如下例子,将文件内容按行读取后,使用带有缓存的writer在文件末尾追加,并标注行号
func file() {
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
defer file.Close()
if err != nil {
return
}
writer := bufio.NewWriter(file)
reader := bufio.NewReader(file)
n:=0
for {
line, _, err := reader.ReadLine()
if err!=nil {
break
}
n++
writer.WriteString("\n" + strconv.Itoa(n) + " " +string(line))
}
writer.Flush()
}
Tip:
- 在使用writer.WriteString()时,实际上是将内容写入了缓存,需要使用writer.Flush(),将内容刷新到文件中
- 可以使用file.Seek(0,io.SeekStart)来将内容进行覆盖(将光标移到文件最开始)
文件的复制
调用io包中的方法进行实现,实际上只是从src文件中内容覆盖到目标文件中,若目标文件行大于源文件,多出来的行不变化
func file() {
file1, _ := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
file2, _ := os.OpenFile("./testCopy.txt", os.O_CREATE|os.O_RDWR, 0777)
defer file1.Close()
defer file2.Close()
io.Copy(file2,file1)
}
本文正在参加技术专题18期-聊聊Go语言框架