go文件操作

https://studygolang.com/static/pkgdoc/pkg/os.htm#File

文件对象 os.File

type File struct {
    // 内含隐藏或非导出字段
}

File代表一个打开的文件对象。

函数 Create

func Create(name string) (file *File, err error)

Create 采用模式 0666(任何人都可读写,不可执行)创建一个名为 name 的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于 I/O;对应的文件描述符具有 O_RDWR 模式。如果出错,错误底层类型是*PathError

函数 Open

func Open(name string) (file *File, err error)

以只读方式打开一个文件。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有 O_RDONLY 模式。如果出错,错误底层类型是 *PathError

函数 OpenFile

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

OpenFile 是一个更一般性的文件打开函数,大多数调用者都应用 OpenCreate 代替本函数。它会使用指定的选项(如 O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

参数 flag 可选择的有:

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_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件

参数 perm 对应的权限位,比如 0666 (开头 0 代表8进制) 对应于 -rw-rw-rw-

函数 NewFile

func NewFile(fd uintptr, name string) *File

NewFile 使用给出的Unix文件描述符和名称创建一个文件。

函数Pipe

func Pipe() (r *File, w *File, err error)

Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。

方法 Name

func (f *File) Name() string

Name 方法返回(提供给 Open/Create等方法的)文件名称。

方法 Stat 获取 文件信息

func (f *File) Stat() (fi FileInfo, err error)

Stat 返回描述文件 fFileInfo 类型值。如果出错,错误底层类型是 *PathError
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)   # 这个不知道是什么
}

方法 Fd 返回文件描述符

func (f *File) Fd() uintptr

Fd 返回与文件f对应的整数类型的 Unix 文件描述符。

方法 Chdir 改变当前目录为 f

func (f *File) Chdir() error

Chdir 将当前工作目录修改为 f,f 必须是一个目录。如果出错,错误底层类型是 *PathError

方法 Chmod 修改文件模式

func (f *File) Chmod(mode FileMode) error

Chmod 修改文件的模式。如果出错,错误底层类型是 *PathError

info, _ := f.Stat()   // 默认为 0664
fmt.Println(info.Mode())    // -rw-rw-r--
f.Chmod(os.FileMode(0644))
info, _ = f.Stat()
fmt.Println(info.Mode())   // -rw-r--r--

方法 Chown 修改文件的所属者id 所属组id

func (f *File) Chown(uid, gid int) error

将文件所属改为 root

err = f.Chown(0, 1000)
if err != nil {
    fmt.Println(err)
}
/*-rw-rw-r-- 1 hongyu   hongyu 0 1月 15 16:27 test.txt
            ||    变
            \/    为
-rw-rw-r-- 1 root hongyu 0 1月 15 16:27 test.txt*/

方法 Readdir 读取目录的内容并返回

func (f *File) Readdir(n int) (fi []FileInfo, err error)

Readdir读取目录f的内容,返回一个有n个成员的[]FileInfo,这些FileInfo是被Lstat返回的,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。

如果 n>0Readdir 函数会返回一个最多 n 个成员的切片。这时,如果 Readdir 返回一个空切片,它会返回一个非 nil 的错误说明原因。如果到达了目录f的结尾,返回值 err 会是 io.EOF

如果 n<=0Readdir 函数返回目录中剩余所有文件对象的 FileInfo 构成的切片。此时,如果 Readdir 调用成功(读取所有内容直到结尾),它会返回该切片和 nil 的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的 FileInfo 构成的切片和该错误。

f, err := os.OpenFile("./src/test/file/", os.O_RDONLY, 0666)
...
fi, _ := f.Readdir(-1)   // f 不能有 写 flag
for _, info := range fi {
    fmt.Println(info.Name())
}
// main.go
// test.txt

方法 Readdirnames 读取目录 返回文件名切片

func (f *File) Readdirnames(n int) (names []string, err error)

Readdir读取目录f的内容,返回一个有n个成员的[]string,切片成员为目录中文件对象的名字,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。

如果n>0,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。

如果n<=0,Readdir函数返回目录中剩余所有文件对象的名字构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的名字构成的切片和该错误。

fns, _ := f.Readdirnames(-1)

for _, name := range fns {
    fmt.Println(name)
}

方法 Truncate 改变文件大小

func (f *File) Truncate(size int64) error

Truncate 改变文件的大小,它不会改变 I/O 的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是 *PathError

finfo, _ := f.Stat()    // f 需要可写
fmt.Printf("size: %d\n", finfo.Size())
e := f.Truncate(100)
if e != nil {
    fmt.Println("改变文件大小出错: ", e)
    return
}
finfo, _ = f.Stat()
fmt.Printf("size: %d", finfo.Size())

方法 Read 读取文件内容

func (f *File) Read(b []byte) (n int, err error)

Read 方法从 f 中读取最多 len(b) 字节数据并写入 b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0 个字节且返回值 err 为io.EOF

方法 ReadAt 从指定位置读取

func (f *File) ReadAt(b []byte, off int64) (n int, err error)

ReadAt从指定的位置(相对于文件开始位置)读取 len(b) 字节数据并写入 b。它返回读取的字节数和可能遇到的任何错误。当 n<len(b) 时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是 io.EOF

方法 Write 写入数据

func (f *File) Write(b []byte) (n int, err error)

Write 向文件中写入 len(b) 字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值 n!=len(b),本方法会返回一个非 nil 的错误。

方法 WriteAt 从指定位置写入数据

func (f *File) WriteAt(b []byte, off int64) (n int, err error)

WriteAt 在指定的位置(相对于文件开始位置)写入 len(b) 字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值 n!=len(b),本方法会返回一个非 nil 的错误。

方法 Seek 指定下次读/写的开始位置

func (f *File) Seek(offset int64, whence int) (ret int64, err error)

Seek 设置下一次读/写的位置。offset 为相对偏移量,而 whence 决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。

方法 Sync 刷新到硬盘

func (f *File) Sync() (err error)

Sync 递交文件的当前内容进行稳定的存储。一般来说,这表示将文件系统的最近写入的数据在内存中的拷贝刷新到硬盘中稳定保存。

方法 Close 关闭文件描述符

func (f *File) Close() error

Close关闭文件f,使文件对象 f 不能用于读写。它返回可能出现的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值