01
介绍
Golang 语言的标准库 os 包提供独立于平台的操作系统相关功能的接口。其设计类似于 Unix,尽管错误处理类似于 Go,调用失败则返回 error 类型的错误,而不是错误编号的值。通常,error 类型的错误中会提供更多信息。
例如 Open 或 Stat,如果返回 error,那么错误将在打印时包含失败的文件名,并且错误类型为 *PathError
,可以通过 *PathError
的方法获取更多信息。
type PathError struct { Op string Path string Err error }
os 接口旨在在所有操作系统上保持统一。不通用的功能在系统特定的 syscall 包中实现。
此外,os 包还有三个子包,分别是:
- os/exec 运行外部命令。
- os/signal 操作传入的信号。
- os/user 允许按名称或 ID 查找用户帐户。
但是,本文只介绍 os 包关于目录和文件的操作。
02
函数
os 包提供了很多函数,限于篇幅,我们不会一一介绍,而是主要介绍项目开发中比较常用的关于目录和文件的相关函数。
目录
- func UserHomeDir() (string, error) 返回当前用户的家目录。
- func Mkdir(name string, perm FileMode) error 根据给定目录名称和目录权限,创建一个新的目录。
- func MkdirAll(path string, perm FileMode) error 根据给定目录路径和目录权限,创建所有目录,目录权限作用于被创建的所有目录。
- func Rename(oldpath, newpath string) error 根据给定的新旧目录名,修改旧目录名,也可用于移动目录。
- func Remove(name string) error 删除给定名称的文件或空目录。
- func RemoveAll(path string) error 删除给定路径的所有目录,包含子目录。
- func Getwd() (dir string, err error) 获取当前的工作目录,如果有多个目录可以到达当前目录,返回任意一个目录。
- func Chdir(dir string) error 修改当前的工作目录为给定的目录名。
文件
- func Create(name string) (*File, error) 创建或截断给定文件,如果给定文件已存在,将被截断,如果给定文件不存在,将被创建,并且文件权限为
0666
。 - func Open(name string) (*File, error) 打开要读取的文件,文件权限为只读。
- func OpenFile(name string, flag int, perm FileMode) (*File, error) 根据给定文件名、flag 和文件权限,打开该文件,如果该文件不存在,可以通过 flag 传值
O_CREATE
创建文件,多个 flag 使用|
分隔,例如O_CREATE|O_APPEND
。
03
文件
文件信息 FileInfo interface
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) }
FileInfo 接口封装了文件信息相关的方法,可以通过函数 Stat
和 Lstat
获取 FileInfo。
fi, err := os.Stat("file1.txt") if err != nil { fmt.Println(err) return }
文件权限 FileMode
type FileMode uint32
FileMode 可以用于获取文件权限。
获取文件权限的示例代码:
fi, err := f.Stat() if err != nil { fmt.Println(err) return } fileMode := fi.Mode().String() fmt.Println(fileMode)
文件 File
type File struct { // contains filtered or unexported fields }
File 表示打开的文件描述符,它提供了一些操作文件的方法。
关于文件的操作,主要分为打开、关闭和读写,关于打开文件的三种方式,已在 Part 02 函数部分介绍,关闭文件是调用函数 Close,为了防止忘记关闭文件,通常和 defer 搭配使用。
下面主要介绍读写文件。
写文件
- func (f *File) Write(b []byte) (n int, err error) Write 方法将给定字节切片写入文件。
- func (f *File) WriteAt(b []byte, off int64) (n int, err error) WriteAt 方法指定文件的字节偏移位置,将给定字节切片写入文件,如果文件是 O_APPEND,WriteAt 返回错误。
- func (f *File) WriteString(s string) (n int, err error) WriteString 方法使用方式和 Write 方法相同,区别是写入内容由字节切片改为字符串。
- func (f *File) Truncate(size int64) error 根据给定参数,截断文件。
读文件
- func (f *File) Read(b []byte) (n int, err error) 读取文件的最大长度的字节。
b := make([]byte, 5) n, err := f.Read(b) if err != nil { fmt.Println(err) return } fmt.Println(b) fmt.Println(string(b)) fmt.Println(n)
- func (f *File) ReadAt(b []byte, off int64) (n int, err error) 从文件的字节偏移量位置开始读取最大长度的字节
b := make([]byte, 5) n, err := f.ReadAt(b, 10) if err != nil { fmt.Println(err) return } fmt.Println(b) fmt.Println(n) fmt.Println(string(b))
04
总结
本文主要介绍的是通过 Golang 语言标准库 os 包如何操作目录和文件,此外,os 包还有其他用法,比如操作环境变量。建议感兴趣的读者阅读 os 包的官方文档,了解更多关于 os 包的用法。