操作文件
# 1.文件的打开与关闭
- Open 函数
- func Open(name string) (file *File, err error)
- Open 打开一个文件用于读取
- Close 函数
- func (f *File) Close() error
- Close 关闭文件 f
# 2.文件读取
- Read 函数(不带缓冲区去读)
- func (f *File) Read(b []byte) (n int, err error)
- Read 方法从 f 中读取最多 len(b)字节数据并写入 b
package main
import (
"fmt"
"os"
)
func main() {
// 1.打开一个文件
// 注意: 文件不存在不会创建, 会报错
// 注意: 通过Open打开只能读取, 不能写入
fp, err := os.Open("E:/Go/1.txt")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(fp)
}
// 2.关闭一个文件
defer func() {
err = fp.Close()
if err != nil {
fmt.Println(err)
}
}()
//3.读取指定指定字节个数据
//注意点: \n也会被读取进来
buf := make([]byte, 50)
count, err := fp.Read(buf)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(count)
fmt.Println(string(buf))
}
// 4.读取文件中所有内容, 直到文件末尾为止
// buf := make([]byte, 10)
// for {
// count, err := fp.Read(buf)
// // 注意: 这行代码要放到判断EOF之前, 否则会出现少读一行情况
// fmt.Print(string(buf[:count]))
// if err == io.EOF {
// break
// }
// }
}
- ReadBytes 和 ReadString 函数(带缓冲区去读)
- func (b *Reader) ReadBytes(delim byte) (line []byte, err error)
- ReadBytes 读取直到第一次遇到 delim 字节
- func (b *Reader) ReadString(delim byte) (line string, err error)
- ReadString 读取直到第一次遇到 delim 字节
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 1.打开一个文件
// 注意: 文件不存在不会创建, 会报错
// 注意: 通过Open打开只能读取, 不能写入
fp, err := os.Open("E:/Go/1.txt")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(fp)
}
// 2.关闭一个文件
defer func() {
err = fp.Close()
if err != nil {
fmt.Println(err)
}
}()
// 3.读取一行数据
// 创建读取缓冲区, 默认大小4096
r := bufio.NewReader(fp)
buf, err := r.ReadBytes('\n')
//buf, err := r.ReadString('\n')
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(buf))
}
// 4.读取文件中所有内容, 直到文件末尾为止
// r := bufio.NewReader(fp)
// for {
// //buf, err := r.ReadBytes('\n')
// buf, err := r.ReadString('\n')
// fmt.Print(string(buf))
// if err == io.EOF {
// break
// }
// }
}
# 3.文件的创建和写入
- Create 函数
- func Create(name string) (file *File, err error)
- Create 采用模式 0666(任何人都可读写,不可执行)创建一个名为 name 的文件
- 如果文件存在会覆盖原有文件
- Write 函数
- func (f *File) Write(b []byte) (n int, err error)
- 将指定字节数组写入到文件中
- WriteString 函数
- func (f *File) WriteString(s string) (ret int, err error)
- 将指定字符串写入到文件中
OpenFile 函数
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
第一个参数:打开的路径
第二个参数:打开的模式
const(
O_RDONLY int = syscall.O_RDONLY // 只读模式
O_WRONLY int = syscall.O_WRONLY // 只写模式
O_RDWR int = syscall.O_RDWR // 读写模式
O_APPEND int = syscall.O_APPEND // 追加模式
O_CREATE int = syscall.O_CREAT // 如果不存在则创建
O_EXCL int = syscall.O_EXCL // 创建时如果文件已存在则返回错误
O_SYNC int = syscall.O_SYNC // 同步模式
O_TRUNC int = syscall.O_TRUNC // 创建时如果文件已存在则截断
)
第三个参数:指定权限
- 0 没有任何权限
- 1 执行权限(如果是可执行程序,可以运行)
- 2 写权限
- 3 写权限和执行权限
- 4 读权限
- 5 读权限和执行权限
- 6 读权限和写权限
- 7 读权限和写权限以及执行权限
const(
// 单字符是被 String 方法用于格式化的属性缩写
ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目录
ModeAppend // a: 只能写入,不能读取
ModeExclusive // l: 排他锁
ModeTemporary // T: 临时文件(临时文件被删除后,文件名将保留)
ModeSymlink // L: 符号链接
ModeDevice // D: 设备
ModeNamedPipe // p: 命名管道(FIFO)
ModeSocket // S: Unix 域套接字
ModeSetuid // u: 设置uid
ModeSetgid // g: 设置gid
ModeCharDevice // c: 字符设备,如终端
ModeSticky // t: 粘性,当文件所有者不是当前用户时,文件只能被文件所
)