新建文件
//函数原型
import os //以下省略此import
func Create(name string) (*File, error) {
return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
//返回值类型: 返回文件指针与一个错误对象
//文件存在则清空
//ps:文件读写必须判断err是否为nil, 防止读写问题影响程序正确性
文件打开
- 只读打开(os.Open)
//函数原型:
func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}
//Open函数默认以只读打开,此文件指针只可以用来进行文件读, mode为O_RDONLY,
//err类型为*PathError
- 可控权限打开(os.FileOpen)
//函数原型:
@name: 打开文件的path
@flag: 三种常见模式: os.O_RDONLY, os.O_WRONLY,OS_RDWR
@perm: 权限: 默认写6
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
testlog.Open(name)
f, err := openFileNolog(name, flag, perm)
if err != nil {
return nil, err
}
f.appendMode = flag&O_APPEND != 0
return f, nil
}
文件读
- 最常用: Read
//返回n代表实际读的字节数,Write函数同
func (f *File) Read(b []byte) (n int, err error) {
if err := f.checkValid("read"); err != nil {
return 0, err
}
n, e := f.read(b)
return n, f.wrapErr("read", e)
}
- 按照行读取
import bufio //导入bufio包
//读取步骤:
//打开文件
f, err := os.OpenFile("./03-jii.cc", os.O_RDWR, 6)
if err != nil {
fmt.Println("openerr:", err)
return
}
defer f.Close()
//创建一个带缓冲区的reader
reader := bufio.NewReader(f)
for {
//从reader缓冲区读取指定长度数据, 长度取决于dlime参数('\n'按行读)
buf, err := reader.ReadBytes('\n')
//通过err!=nil && err == io.EOF判断文件结尾
//文件结尾标志需要再读取一次EOF标识符
if err != nil && err == io.EOF {
fmt.Println("over")
break
} else if err != nil{
fmt.Println("readerr", err)
return
}
fmt.Print(string(buf))
}
写文件
- 最常用: Write
//函数原型:
func (f *File) Write(b []byte) (n int, err error) {
if err := f.checkValid("write"); err != nil {
return 0, err
}
n, e := f.write(b)
if n < 0 {
n = 0
}
if n != len(b) {
err = io.ErrShortWrite
}
epipecheck(f, e)
if e != nil {
err = f.wrapErr("write", e)
}
return n, err
}
- 按位置写
Seek函数--->操作文件的指针位置
@offset 从指定位置偏移量(>0正向, <0逆向)
@whence: io.SeekStart //起始位置
io.SeekCurrent //当前位置
io.SeekEnd //结尾
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
指定位置写
@b 写入的字符切片
@off Seek修改定位后的返回值,或io自带位置宏
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
- 按字符串写
//函数原型:
//传入字符串,传出写入字符串长与err
func (f *File) WriteString(s string) (n int, err error) {
return f.Write([]byte(s))
}
目录操作
- 目录打开:
同使用OpenFile,第三个参数传入os.ModeDir - 目录读取ReadDir:
// 函数原型:
@n 获取目录项个数, -1表示全部目录项
func (f *File) Readdir(n int) ([]FileInfo, error) {
if f == nil {
return nil, ErrInvalid
}
return f.readdir(n)
}
//FileInfo 文件描述接口:
type FileInfo interface {
Name() string // base name of the file
Size() int64 // length in bytes for regular files; system-dependent for others
Mode() FileMode // file mode bits
ModTime() time.Time // modification time
IsDir() bool // abbreviation for Mode().IsDir()
Sys() interface{} // underlying data source (can return nil)
}
网友评论