os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。os包的接口规定为在所有操作系统中都是一致的。非公用的属性可以从操作系统特定的syscall包获取。
官方链接:https://studygolang.com/pkgdoc
=============== 函数部分 =====================
func Hostname
func Hostname() (name string, err error)
Hostname返回内核提供的主机名。
func Getpagesize
func Getpagesize() int
Getpagesize返回底层的系统内存页的尺寸。
func Environ
func Environ() []string
Environ返回表示环境变量的格式为"key=value"的字符串的切片拷贝。
func Getenv
func Getenv(key string) string
Getenv检索并返回名为key的环境变量的值。如果不存在该环境变量会返回空字符串。
func Setenv
func Setenv(key, value string) error
Setenv设置名为key的环境变量。如果出错会返回该错误。
func Clearenv
func Clearenv()
Clearenv删除所有环境变量。
func Exit
func Exit(code int)
Exit让当前程序以给出的状态码code退出。一般来说,状态码0表示成功,非0表示出错。程序会立刻终止,defer的函数不会被执行。
func Expand
func Expand(s string, mapping func(string) string) string
Expand函数替换s中的${var}或$var为mapping(var)。例如,os.ExpandEnv(s)等价于os.Expand(s, os.Getenv)。
import os import fmt mapping := func(s string) string { m := map[string]string{"name": "xiaozhang", "age":"18"} return m[s] } data := "hello $name, you age is $age" fmt.Printf("%s", os.Expand(data, mapping)) //输出hello xiaozhang, you age is 18
func ExpandEnv
func ExpandEnv(s string) string
ExpandEnv函数替换s中的${var}或$var为名为var 的环境变量的值。引用未定义环境变量会被替换为空字符串。
import os path := "GOBIN PATH $APPDATA" fmt.Println(os.ExpandEnv(path)) //输出GOBIN PATH C:UserssunailongAppDataRoaming
func Getuid
func Getuid() int
Getuid返回调用者的用户ID。
func Geteuid
func Geteuid() int
Geteuid返回调用者的有效用户ID。
func Getgid
func Getgid() int
Getgid返回调用者的组ID。
func Getegid
func Getegid() int
Getegid返回调用者的有效组ID。
func Getgroups
func Getgroups() ([]int, error)
Getgroups返回调用者所属的所有用户组的组ID。
//go version:1.9, windows platform import os fmt.Println(os.ExpandEnv(path)) fmt.Println(os.Getuid()) fmt.Println(os.Geteuid()) fmt.Println(os.Getgid()) fmt.Println(os.Getgroups()) 输出: -1 //如果是unix平台返回 0 -1 //如果是unix平台返回 0 -1 //如果是unix平台返回 0 [] getgroups: not supported by windows
func Getpid
func Getpid() int
Getpid返回调用者所在进程的进程ID。
func Getppid
func Getppid() int
Getppid返回调用者所在进程的父进程的进程ID。
func IsPathSeparator
func IsPathSeparator(c uint8) bool
IsPathSeparator返回字符c是否是一个路径分隔符。
fmt.Println(os.IsPathSeparator('/')) //true fmt.Println(os.IsPathSeparator('|')) //false
func Getwd
func Getwd() (dir string, err error)
Getwd返回一个对应当前工作目录的根路径。如果当前目录可以经过多条路径抵达(因为硬链接),Getwd会返回其中一个。
func Chdir
func Chdir(dir string) error
Chdir将当前工作目录修改为dir指定的目录。如果出错,会返回*PathError底层类型的错误。
fmt.Println(os.Getwd()) os.Chdir("C:/") fmt.Println(os.Getwd()) 输出 // E:projectsGoProjectsgopl.io <nil> // C: <nil>
func Chmod ¶
func Chmod(name string, mode FileMode) error
Chmod修改name指定的文件对象的mode。如果name指定的文件是一个符号链接,它会修改该链接的目的地文件的mode。如果出错,会返回*PathError底层类型的错误。
windows 不行
func Chown
func Chown(name string, uid, gid int) error
Chmod修改name指定的文件对象的用户id和组id。如果name指定的文件是一个符号链接,它会修改该链接的目的地文件的用户id和组id。如果出错,会返回*PathError底层类型的错误。uid/gid为数字
func Lchown
func Lchown(name string, uid, gid int) error
Chmod修改name指定的文件对象的用户id和组id。如果name指定的文件是一个符号链接,它会修改该符号链接自身的用户id和组id。如果出错,会返回*PathError底层类型的错误。
func Chtimes
func Chtimes(name string, atime time.Time, mtime time.Time) error
Chtimes修改name指定的文件对象的访问时间和修改时间,类似Unix的utime()或utimes()函数。底层的文件系统可能会截断/舍入时间单位到更低的精确度。如果出错,会返回*PathError底层类型的错误。
func Mkdir
func Mkdir(name string, perm FileMode) error
Mkdir使用指定的权限和名称创建一个目录。如果出错,会返回*PathError底层类型的错误。
func MkdirAll
func MkdirAll(path string, perm FileMode) error
MkdirAll使用指定的权限和名称创建一个目录,包括任何必要的上级目录,并返回nil,否则返回错误。权限位perm会应用在每一个被本函数创建的目录上。如果path指定了一个已经存在的目录,MkdirAll不做任何操作并返回nil。
func Rename
func Rename(oldpath, newpath string) error
Rename修改一个文件的名字,移动一个文件。可能会有一些个操作系统特定的限制。
func Truncate
func Truncate(name string, size int64) error
Truncate修改name指定的文件的大小。如果该文件为一个符号链接,将修改链接指向的文件的大小。如果出错,会返回*PathError底层类型的错误。
func Remove
func Remove(name string) error
Remove删除name指定的文件或目录。如果出错,会返回*PathError底层类型的错误。
func RemoveAll
func RemoveAll(path string) error
RemoveAll删除path指定的文件,或目录及它包含的任何下级对象。它会尝试删除所有东西,除非遇到错误并返回。如果path指定的对象不存在,RemoveAll会返回nil而不返回错误。
func Readlink
func Readlink(name string) (string, error)
Readlink获取name指定的符号链接文件指向的文件的路径。如果出错,会返回*PathError底层类型的错误。
func Symlink
func Symlink(oldname, newname string) error
Symlink创建一个名为newname指向oldname的符号链接。如果出错,会返回* LinkError底层类型的错误。
func Link
func Link(oldname, newname string) error
Link创建一个名为newname指向oldname的硬链接。如果出错,会返回* LinkError底层类型的错误。
func SameFile ¶
func SameFile(fi1, fi2 FileInfo) bool
SameFile返回fi1和fi2是否在描述同一个文件。例如,在Unix这表示二者底层结构的设备和索引节点是相同的;在其他系统中可能是根据路径名确定的。SameFile应只使用本包Stat函数返回的FileInfo类型值为参数,其他情况下,它会返回假。
====================Error=============================
func IsExist
func IsExist(err error) bool
返回一个布尔值说明该错误是否表示一个文件或目录已经存在。ErrExist和一些系统调用错误会使它返回真。
func IsNotExist
func IsNotExist(err error) bool
返回一个布尔值说明该错误是否表示一个文件或目录不存在。ErrNotExist和一些系统调用错误会使它返回真。
func IsPermission
func IsPermission(err error) bool
返回一个布尔值说明该错误是否表示因权限不足要求被拒绝。ErrPermission和一些系统调用错误会使它返回真。
这三个函数基于error,就是要根据相关操作的error返回再判断是否是因为这三个原因导致的错误。
=======================Interface============================
type FileInfo
type FileInfo interface {
Name() string // 文件的名字(不含扩展名)
Size() int64 // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
Mode() FileMode // 文件的模式位
ModTime() time.Time // 文件的修改时间
IsDir() bool // 等价于Mode().IsDir()
Sys() interface{} // 底层数据来源(可以返回nil)
}
func Stat ¶
func Stat(name string) (fi FileInfo, err error)
Stat返回一个描述name指定的文件对象的FileInfo。如果指定的文件对象是一个符号链接,返回的FileInfo描述该符号链接指向的文件的信息,本函数会尝试跳转该链接。如果出错,返回的错误值为*PathError类型。
func Lstat
func Lstat(name string) (fi FileInfo, err error)
Lstat返回一个描述name指定的文件对象的FileInfo。如果指定的文件对象是一个符号链接,返回的FileInfo描述该符号链接的信息,本函数不会试图跳转该链接。如果出错,返回的错误值为*PathError类型。
FileInfo用来描述一个文件对象。
fi, err3 := os.Stat(file) if err3 != nil { fmt.Println(err) }else { fmt.Println(fi) fileinfo := fi fname := fileinfo.Name() size := fileinfo.Size() mode := fileinfo.Mode() modtime := fileinfo.ModTime() dir := fileinfo.IsDir() fmt.Println(fname , size, mode, modtime, dir) } 输出: &{test.txt {32 {3933573732 30617868} {3933573732 30617868} {1088149345 30617869} 0 130} 0 {0 0} E:/projects/GoProjects/gopl.io/exercise/lesson01/test.txt 0 0 0 false} test.txt 130 -rw-rw-rw- 2017-09-19 14:05:11.6361569 +0800 CST false
type FileMode ¶
type FileMode uint32
FileMode代表文件的模式和权限位。这些字位在所有的操作系统都有相同的含义,因此文件的信息可以在不同的操作系统之间安全的移植。不是所有的位都能用于所有的系统,唯一共有的是用于表示目录的ModeDir位。
const ( // 单字符是被String方法用于格式化的属性缩写。 ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目录 ModeAppend // a: 只能写入,且只能写入到末尾 ModeExclusive // l: 用于执行 ModeTemporary // T: 临时文件(非备份文件) ModeSymlink // L: 符号链接(不是快捷方式文件) ModeDevice // D: 设备 ModeNamedPipe // p: 命名管道(FIFO) ModeSocket // S: Unix域socket ModeSetuid // u: 表示文件具有其创建者用户id权限 ModeSetgid // g: 表示文件具有其创建者组id的权限 ModeCharDevice // c: 字符设备,需已设置ModeDevice ModeSticky // t: 只有root/创建者能删除/移动文件 // 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置 ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice ModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位) )
这些被定义的位是FileMode最重要的位。另外9个不重要的位为标准Unix rwxrwxrwx权限(任何人都可读、写、运行)。这些(重要)位的值应被视为公共API的一部分,可能会用于线路协议或硬盘标识:它们不能被修改,但可以添加新的位。
func (FileMode) IsDir
func (m FileMode) IsDir() bool
IsDir报告m是否是一个目录。
func (FileMode) IsRegular
func (m FileMode) IsRegular() bool
IsRegular报告m是否是一个普通文件。
func (FileMode) Perm
func (m FileMode) Perm() FileMode
Perm方法返回m的Unix权限位。
func (FileMode) String
func (m FileMode) String() string
fmt.Println(fileinfo.Mode().IsDir())
fmt.Println(fileinfo.Mode().IsRegular())
fmt.Println(fileinfo.Mode().Perm())
fmt.Println(fileinfo.Mode().String())
输出为: false
true
-rw-rw-rw-
-rw-rw-rw-
===================== STRUCT : File================================
type File
type File struct {
// 内含隐藏或非导出字段
}
File代表一个打开的文件对象。
func Create
func Create(name string) (file *File, err error)
Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。
func Open
func Open(name string) (file *File, err error)
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。
func OpenFile
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
func NewFile
func NewFile(fd uintptr, name string) *File
NewFile使用给出的Unix文件描述符和名称创建一个文件。
func (*File) Fd
func (f *File) Fd() uintptr
Fd返回与文件f对应的整数类型的Unix文件描述符。
os.Fd()返回文件的句柄,函数原型是func (file *File) Fd() uintptr函数是这样的uintptr(file.fd) 返回的是文件的句柄,句柄是什么?句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数
func Pipe
func Pipe() (r *File, w *File, err error)
Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。
func (*File) Read
func (f *File) Read(b []byte) (n int, err error)
Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。
func (*File) ReadAt
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。
func (*File) Write
func (f *File) Write(b []byte) (n int, err error)
Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b)即返回写入的长度,本方法会返回一个非nil的错误。
func (*File) WriteString
func (f *File) WriteString(s string) (ret int, err error)
WriteString类似Write,但接受一个字符串参数。
func (*File) WriteAt
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
func (*File) Name
func (f *File) Name() string
Name方法返回(提供给Open/Create等方法的)文件名称。
func (*File) Stat
func (f *File) Stat() (fi FileInfo, err error)
Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。
func (*File) Fd
func (f *File) Fd() uintptr
Fd返回与文件f对应的整数类型的Unix文件描述符。
func (*File) Chdir
func (f *File) Chdir() error
Chdir将当前工作目录修改为f,f必须是一个目录。如果出错,错误底层类型是*PathError。
func (*File) Chmod
func (f *File) Chmod(mode FileMode) error
Chmod修改文件的模式。如果出错,错误底层类型是*PathError。
func (*File) Chown
func (f *File) Chown(uid, gid int) error
Chown修改文件的用户ID和组ID。如果出错,错误底层类型是*PathError。
func (*File) 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构成的切片和该错误。
package main import ( "os" "fmt" "log" ) func main(){ fd, err := os.Open(".") if err != nil{ log.Fatal(err) }else { dirs, err2 := fd.Readdir(-1) if err2 != nil{ log.Fatal(err2) }else { fmt.Println(dirs) for i:=0; i<len(dirs);i++{ fmt.Println(dirs[i].Name()) } } } }
输出结果为当前目录下所有文件和文件夹
func (*File) 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的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的名字构成的切片和该错误。
func (*File) Truncate
func (f *File) Truncate(size int64) error
Truncate改变文件的大小,它不会改变I/O的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是*PathError。
func (*File) Seek
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
Seek设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
func (*File) Sync
func (f *File) Sync() (err error)
Sync递交文件的当前内容进行稳定的存储。一般来说,这表示将文件系统的最近写入的数据在内存中的拷贝刷新到硬盘中稳定保存。
func (*File) Close
func (f *File) Close() error
Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
===================== STRUCT : Process================================
type ProcAttr
type ProcAttr struct {
// 如果Dir非空,子进程会在创建进程前先进入该目录。(即设为当前工作目录)
Dir string
// 如果Env非空,它会作为新进程的环境变量。必须采用Environ返回值的格式。
// 如果Env为空字符串,将使用Environ函数的返回值。
Env []string
// Files指定被新进程继承的活动文件对象。
// 前三个绑定为标准输入、标准输出、标准错误输出。
// 依赖底层操作系统的实现可能会支持额外的数据出入途径。
// nil条目相当于在进程开始时关闭的文件对象。
Files []*File
// 操作系统特定的创建属性。
// 注意设置本字段意味着你的程序可能会运作失常甚至在某些操作系统中无法通过编译。
Sys *syscall.SysProcAttr
}
ProcAttr保管将被StartProcess函数用于一个新进程的属性。
type Process
type Process struct { Pid int // 内含隐藏或非导出字段 }
func FindProcess ¶
func FindProcess(pid int) (p *Process, err error)
FindProcess根据进程id查找一个运行中的进程。函数返回的进程对象可以用于获取其关于底层操作系统进程的信息。
func StartProcess
func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)
StartProcess使用提供的属性、程序名、命令行参数开始一个新进程。StartProcess函数是一个低水平的接口。os/exec包提供了高水平的接口,应该尽量使用该包。如果出错,错误的底层类型会是*PathError。
func (*Process) Signal
func (p *Process) Signal(sig Signal) error
Signal方法向进程发送一个信号。在windows中向进程发送Interrupt信号尚未实现。
func (*Process) Kill
func (p *Process) Kill() error
Kill让进程立刻退出。
func (*Process) Wait
func (p *Process) Wait() (*ProcessState, error)
Wait方法阻塞直到进程退出,然后返回一个描述ProcessState描述进程的状态和可能的错误。Wait方法会释放绑定到进程p的所有资源。在大多数操作系统中,进程p必须是当前进程的子进程,否则会返回错误。
func (*Process) Release
func (p *Process) Release() error
Release释放进程p绑定的所有资源, 使它们(资源)不能再被(进程p)使用。只有没有调用Wait方法时才需要调用本方法。
type ProcessState
type ProcessState struct {
// 内含隐藏或非导出字段
}
ProcessState保管Wait函数报告的某个已退出进程的信息。
func (*ProcessState) Pid
func (p *ProcessState) Pid() int
Pi返回一个已退出的进程的进程id。
func (*ProcessState) Exited
func (p *ProcessState) Exited() bool
Exited报告进程是否已退出。
func (*ProcessState) Success
func (p *ProcessState) Success() bool
Success报告进程是否成功退出,如在Unix里以状态码0退出。
func (*ProcessState) SystemTime
func (p *ProcessState) SystemTime() time.Duration
SystemTime返回已退出进程及其子进程耗费的系统CPU时间。
func (*ProcessState) UserTime
func (p *ProcessState) UserTime() time.Duration
UserTime返回已退出进程及其子进程耗费的用户CPU时间。
func (*ProcessState) Sys
func (p *ProcessState) Sys() interface{}
Sys返回该已退出进程系统特定的退出信息。需要将其类型转换为适当的底层类型,如Unix里转换为*syscall.WaitStatus类型以获取其内容。
func (*ProcessState) SysUsage
func (p *ProcessState) SysUsage() interface{}
SysUsage返回该已退出进程系统特定的资源使用信息。需要将其类型转换为适当的底层类型,如Unix里转换为*syscall.Rusage类型以获取其内容。
func (*ProcessState) String ¶
func (p *ProcessState) String() string