https://studygolang.com/static/pkgdoc/pkg/os.htm#File
文章目录
- 文件对象 os.File
- 函数 Create
- 函数 Open
- 函数 OpenFile
- 函数 NewFile
- 函数Pipe
- 方法 Name
- 方法 Stat 获取 文件信息
- 方法 Fd 返回文件描述符
- 方法 Chdir 改变当前目录为 f
- 方法 Chmod 修改文件模式
- 方法 Chown 修改文件的所属者id 所属组id
- 方法 Readdir 读取目录的内容并返回
- 方法 Readdirnames 读取目录 返回文件名切片
- 方法 Truncate 改变文件大小
- 方法 Read 读取文件内容
- 方法 ReadAt 从指定位置读取
- 方法 Write 写入数据
- 方法 WriteAt 从指定位置写入数据
- 方法 Seek 指定下次读/写的开始位置
- 方法 Sync 刷新到硬盘
- 方法 Close 关闭文件描述符
文件对象 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
是一个更一般性的文件打开函数,大多数调用者都应用 Open
或 Create
代替本函数。它会使用指定的选项(如 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
返回描述文件 f
的 FileInfo
类型值。如果出错,错误底层类型是 *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>0
,Readdir
函数会返回一个最多 n 个成员的切片。这时,如果 Readdir
返回一个空切片,它会返回一个非 nil 的错误说明原因。如果到达了目录f的结尾,返回值 err 会是 io.EOF
。
如果 n<=0
,Readdir
函数返回目录中剩余所有文件对象的 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 不能用于读写。它返回可能出现的错误。