go文件/目录操作整理

2019-10-31  本文已影响0人  kilicmu
新建文件
//函数原型
import os  //以下省略此import
func Create(name string) (*File, error) {
    return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
//返回值类型: 返回文件指针与一个错误对象
//文件存在则清空
//ps:文件读写必须判断err是否为nil, 防止读写问题影响程序正确性
文件打开
//函数原型:
func Open(name string) (*File, error) {
     return OpenFile(name, O_RDONLY, 0)
}
//Open函数默认以只读打开,此文件指针只可以用来进行文件读, mode为O_RDONLY,
//err类型为*PathError
//函数原型:
@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
}
文件读
//返回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))
}
写文件
//函数原型:
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
}

@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))
}
目录操作
//  函数原型:
@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)
}
上一篇 下一篇

猜你喜欢

热点阅读