Go语言从入门到规范-6.2、Go语言os包


文章目录

以下内容主要来自:​​https://go-zh.org/pkg/os/​​,部分内容通过实践进行总结。

主要是熟悉以下相关接口,在实际开发过程中根据需要可以找到,不至于卡住开发思路。

1.概述

​Package os提供了一个独立于平台的操作系统功能接口。​​​该设计类似于unix,尽管错误处理类似于go;失败的调用返回的是error类型的值,而不是错误号。通常,在错误中可以得到更多的信息。例如,如果接受文件名的调用失败,例如Open或Stat,则在打印时错误将包括失败的文件名,并且类型为​​*PathError​​,可以解包以获取更多信息。

os接口在所有操作系统中是统一的。特定于系统的包sycall中出现了一般不可用的特性。

下面是一个简单的例子,打开一个文件并读取其中的一些内容。

file, err := os.Open("file.go") // For read access.
if err != nil {
log.Fatal(err)
}

如果打开失败,错误字符串将是不言自明的,例如

open file.go: no such file

然后可以将文件的数据读入字节片。读和写的字节数取自参数slice的长度。

data := make([]byte, 100)
count, err := file.Read(data)
if err != nil {
log.Fatal(err)
}
fmt.Printf("read %d bytes: %q\n", count, data[:count])

一些源码包:​​dir_unix.go​​​ ​​doc.go​​​ ​​env.go​​​ ​​error.go​​​ ​​error_unix.go​​​ ​​exec.go​​​ ​​exec_posix.go​​​ ​​exec_unix.go​​​ ​​file.go​​​ ​​file_posix.go​​​ ​​file_unix.go​​​ ​​getwd.go​​​ ​​path.go​​​ ​​path_unix.go​​​ ​​pipe_linux.go​​​ ​​proc.go​​​ ​​stat_linux.go​​​ ​​sticky_notbsd.go​​​ ​​str.go​​​ ​​sys_linux.go​​​ ​​sys_unix.go​​​ ​​types.go​​​ ​​types_notwin.go​

2.常量

const (
O_RDONLY int = syscall.O_RDONLY // open the file read-only.
O_WRONLY int = syscall.O_WRONLY // open the file write-only.
O_RDWR int = syscall.O_RDWR // open the file read-write.
O_APPEND int = syscall.O_APPEND // append data to the file when writing.
O_CREATE int = syscall.O_CREAT // create a new file if none exists.
O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist
O_SYNC int = syscall.O_SYNC // open for synchronous I/O.
O_TRUNC int = syscall.O_TRUNC // if possible, truncate file when opened.
)

打开的标记包装底层系统的标记。不是所有的标志都可以在一个给定的系统上实现。

const (
SEEK_SET int = 0 // seek relative to the origin of the file
SEEK_CUR int = 1 // seek relative to the current offset
SEEK_END int = 2 // seek relative to the end
)

文件seek位置。

const (
PathSeparator = '/' // OS-specific path separator
PathListSeparator = ':' // OS-specific path list separator
)
const DevNull = "/dev/null"

DevNull是操作系统的“空设备”的名称。在类unix系统中,它是"/dev/null";在Windows上,“NUL”。

3.变量

var (
ErrInvalid = errors.New("invalid argument")
ErrPermission = errors.New("permission denied")
ErrExist = errors.New("file already exists")
ErrNotExist = errors.New("file does not exist")
)

一些常见系统调用错误的可移植类似物.

var (
Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

Stdin、Stdout和Stderr是指向标准输入、标准输出和标准错误文件描述符的打开文件。

var Args []string

Args保存命令行参数,从程序名开始。

4.func ​​Chdir​

func Chdir(dir string) error

Chdir将当前工作目录更改为命名目录。如果有错误,它的类型是*PathError。

5.func ​​Chmod​

func Chmod(name string, mode FileMode) error

Chmod修改命名文件的模式为mode。如果文件是一个符号链接,它会改变链接目标的模式。如果有错误,它的类型是*PathError。

6.func ​​Chown​

func Chown(name string, uid, gid int) error

Chown修改命名文件的数字uid和gid。如果文件是一个符号链接,它将更改链接目标的uid和gid。如果有错误,它的类型是*PathError。

7.func ​​Chtimes​

func Chtimes(name string, atime time.Time, mtime time.Time) error

Chtimes修改命名文件的访问和修改时间,类似于Unix的utime()或utimes()函数。
底层文件系统可能会将值截断或舍入到一个不那么精确的时间单位。如果有错误,它的类型是*PathError。

8.func ​​Clearenv​

func Clearenv()

Clearenv删除所有环境变量。

9.func ​​Environ​

func Environ() []string

Environ返回一个表示环境的字符串副本,格式为"key=value"。

10.func ​​Exit​

func Exit(code int)

Exit使当前程序以给定的状态码退出。按照惯例,代码0表示成功,非0表示错误。程序立即终止;延迟函数不运行。

11.func ​​Expand​

func Expand(s string, mapping func(string) string) string

Expand根据映射函数替换字符串中的Go语言从入门到规范-6.2、Go语言os包_符号链接var。例如,os. expandenv (s)等价于os。扩大(年代,os.Getenv)。

12.func ​​ExpandEnv​

func ExpandEnv(s string) string

ExpandEnv根据当前环境变量的值替换字符串中的Go语言从入门到规范-6.2、Go语言os包_符号链接var。对未定义变量的引用被替换为空字符串。

13.func ​​Getegid​

func Getegid() int

Getegid返回调用者的数字有效组id。

14.func ​​Getenv​

func Getenv(key string) string

Getenv检索key命名的环境变量的值。它返回值,如果变量不存在,该值将为空。

15.func ​​Geteuid​

func Geteuid() int

Geteuid返回调用者的数字有效用户id。

16.func ​​Getgid​

func Getgid() int

Getgid返回调用者的数字组id.

17.func ​​Getgroups​

func Getgroups() ([]int, error)

Getgroups返回调用者所属组的数字id列表。

18.func ​​Getpagesize​

func Getpagesize() int

返回底层系统的内存页大小。

19.func ​​Getpid​

func Getpid() int

Getpid返回调用者的进程id。

20.func ​​Getppid​

func Getppid() int

Getppid返回调用者父进程的进程id.

21.func ​​Getuid​

func Getuid() int

Getuid返回调用者的数字用户id。

22.func ​​Getwd​

func Getwd() (dir string, err error)

Getwd返回与当前目录对应的根路径名。如果当前目录可以通过多个路径到达(由于符号链接),Getwd可以返回其中的任何一个路径。

23.func ​​Hostname​

func Hostname() (name string, err error)

Hostname返回内核报告的主机名.

24.func ​​IsExist​

func IsExist(err error) bool

IsExist返回一个布尔值,指示是否已知错误,以报告文件或目录已经存在。它满足于ErrExist和一些系统调用错误。

25.func ​​IsNotExist​

func IsNotExist(err error) bool

isnoexistist返回一个布尔值,指示是否已知错误,并报告文件或目录不存在。ErrNotExist和一些系统调用错误满足了这个要求。

26.func ​​IsPathSeparator​

func IsPathSeparator(c uint8) bool

如果c是目录分隔符,则IsPathSeparator返回true。

27.func ​​IsPermission​

func IsPermission(err error) bool

IsPermission返回一个布尔值,指示是否已知错误,以报告权限被拒绝。它由ErrPermission和一些系统调用错误来满足.

28.func ​​Lchown​

func Lchown(name string, uid, gid int) error

Lchown修改命名文件的数字型uid和gid。如果文件是一个符号链接,它会更改链接本身的uid和gid。如果有错误,它的类型是*PathError。

29.func ​​Link​

func Link(oldname, newname string) error

Link创建newname作为到oldname文件的硬链接。如果有错误,它的类型是*LinkError。

30.func ​​Mkdir​

func Mkdir(name string, perm FileMode) error

Mkdir使用指定的名称和权限位创建新目录。如果有错误,它的类型是*PathError。

31.func ​​MkdirAll​

func MkdirAll(path string, perm FileMode) error

MkdirAll创建一个名为path的目录,以及任何必要的父目录,并返回nil,否则返回一个错误。perm权限位用于MkdirAll创建的所有目录。如果path已经是一个目录,MkdirAll将不做任何操作并返回nil。

32.func ​​NewSyscallError​

func NewSyscallError(syscall string, err error) error

NewSyscallError以错误的形式返回一个新的SyscallError,它具有给定的系统调用名称和错误详细信息。为方便起见,如果err为nil, NewSyscallError返回nil。

33.func ​​Readlink​

func Readlink(name string) (string, error)

Readlink返回指定符号链接的目的地。如果有错误,它的类型是*PathError。

34.func ​​Remove​

func Remove(name string) error

Remove删除指定的文件或目录。如果有错误,它的类型是*PathError。

35.func ​​RemoveAll​

func RemoveAll(path string) error

RemoveAll删除路径及其包含的任何子路径。它删除它所能删除的所有内容,但返回它遇到的第一个错误。如果路径不存在,RemoveAll返回nil(没有错误)。

36.func ​​Rename​

func Rename(oldpath, newpath string) error

Rename重命名(移动)一个文件。特定于操作系统的限制可能适用.

37.func ​​SameFile​

func SameFile(fi1, fi2 FileInfo) bool

SameFile报告fi1和fi2是否描述同一个文件。例如,在Unix上,这意味着两个底层结构的device和inode字段是相同的;在其他系统上,决策可能基于路径名。SameFile只应用于该包的Stat返回的结果。在其他情况下它返回false。

38.func ​​Setenv​

func Setenv(key, value string) error

Setenv设置key命名的环境变量的值。它返回一个错误(如果有的话)。

39.func ​​Symlink​

func Symlink(oldname, newname string) error

Symlink创建newname作为到oldname的符号链接。如果有错误,它的类型是*LinkError。

40.func ​​TempDir​

func TempDir() string

TempDir返回用于临时文件的默认目录。

41.func ​​Truncate​

func Truncate(name string, size int64) error

Truncate更改命名文件的大小。如果文件是一个符号链接,它会改变链接目标的大小。如果有错误,它的类型是*PathError。

42.func ​​Unsetenv​

func Unsetenv(key string) error

Unsetenv取消设置单个环境变量.

43.type ​​File​

type File struct {
// contains filtered or unexported fields
}

File表示打开的文件描述符。

(1).func ​​Create​

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

Create创建命名文件模式0666(在umask之前),如果它已经存在,则将其截断。如果成功,返回文件的方法可以用于I/O;相关的文件描述符具有O_RDWR模式。如果有错误,它的类型是*PathError。

(2).func ​​NewFile​

func NewFile(fd uintptr, name string) *File

NewFile返回一个具有给定文件描述符和名称的新文件。

(3).func ​​Open​

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

打开指定文件以供读取。如果成功,返回文件的方法可以用于读取;相关的文件描述符具有O_RDONLY模式。如果有错误,它的类型是*PathError。

(4).func ​​OpenFile​

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

OpenFile是广义的开放调用;大多数用户将使用Open或Create代替。它以指定的标志(O_RDONLY等)和perm(0666等)打开命名文件(如果适用的话)。如果成功,返回文件上的方法可以用于I/O。如果有错误,它的类型是*PathError。

(5).func ​​Pipe​

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

Pipe返回一个连接的文件对;从r读取,返回写入w的字节。它返回文件和一个错误(如果有的话)。

(6).func (*File) ​​Chdir​

func (f *File) Chdir() error

Chdir将当前工作目录更改为文件,该文件必须是一个目录。如果有错误,它的类型是*PathError.

(7).func (*File) ​​Chmod​

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

Chmod修改文件的模式为mode。如果有错误,它的类型是*PathError。

(8).func (*File) ​​Chown​

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

Chown修改命名文件的数字uid和gid。如果有错误,它的类型是*PathError。

(9).func (*File) ​​Close​

func (f *File) Close() error

Close关闭文件,使其无法用于I/O。它返回一个错误(如果有的话)。

(10).func (*File) ​​Fd​

func (f *File) Fd() uintptr

Fd返回引用打开文件的整数Unix文件描述符。文件描述符仅在f.close被调用或f被垃圾收集之前有效。

(11).func (*File) ​​Name​

func (f *File) Name() string

Name返回打开的文件的名称。

(12).func (*File) ​​Read​

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

Read从文件中读取len(b)字节。它返回读取的字节数和一个错误(如果有的话)。EOF的信号是零计数,err设置为io.EOF。

(13).func (*File) ​​ReadAt​

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

ReadAt从文件的字节偏移量off开始读取len(b)字节。它返回读取的字节数和错误(如果有的话)。当n < len(b)时,ReadAt总是返回一个非空错误。文件末尾的错误是io.EOF。

(14).func (*File) ​​Readdir​

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

Readdir读取与file相关的目录内容,并返回一个片,最多包含n个FileInfo值,就像Lstat按照目录顺序返回的那样。后续对同一文件的调用将产生更多的文件信息。

如果n > 0, Readdir最多返回n个FileInfo结构。在这种情况下,如果Readdir返回一个空片,它将返回一个非空错误解释原因。在目录的末尾,错误是io.EOF。

如果n <= 0, Readdir将从单个切片中返回该目录的所有FileInfo。在本例中,如果Readdir成功(一直读取到目录的末尾),它将返回切片和nil错误。如果它在目录结束之前遇到错误,Readdir将返回该点之前读取的文件信息和一个非空错误。

(15).func (*File) ​​Readdirnames​

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

Readdirnames从目录f读取并返回一个名称片。

如果n > 0, Readdirnames最多返回n个名称。在这种情况下,如果Readdirnames返回一个空片,它将返回一个非空错误解释原因。在目录的末尾,错误是io.EOF。

如果n <= 0, Readdirnames返回单个片中目录中的所有名称。在本例中,如果Readdirnames成功(一直读取到目录的末尾),它将返回切片和nil错误。如果它在目录结束之前遇到错误,Readdirnames将返回在该点之前读取的名称和一个非空错误。

(16).func (*File) ​​Seek​

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

Seek将下一个读或写文件的偏移量设置为偏移量,根据偏移量解释:0表示相对于文件的原点,1表示相对于当前偏移量,2表示相对于末尾。它返回新的偏移量和一个错误(如果有的话)。

(17).func (*File) ​​Stat​

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

Stat返回描述文件的FileInfo结构。如果有错误,它的类型是*PathError。

(18).func (*File) ​​Sync​

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

Sync将文件的当前内容提交到稳定存储。通常,这意味着刷新文件系统中最近写入到磁盘的数据的内存副本。

(19).func (*File) ​​Truncate​

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

Truncate更改文件的大小。它不会改变I/O偏移量。如果有错误,它的类型是*PathError。

(20).func (*File) ​​Write​

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

Write将len(b)字节写入文件。它返回已写入的字节数和一个错误(如果有的话)。当n != len(b)时,Write返回一个非空错误。

(21).func (*File) ​​WriteAt​

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

WriteAt从字节偏移量off开始将len(b)字节写入文件。它返回已写入的字节数和一个错误(如果有的话)。当n != len(b)时,WriteAt返回一个非空错误。

(22).func (*File) ​​WriteString​

func (f *File) WriteString(s string) (ret int, err error)

WriteString与Write类似,但写入字符串s的内容,而不是字节片。

44.type ​​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)
}

FileInfo描述一个文件,由Stat和Lstat返回。

(1).func ​​Lstat​

func Lstat(name string) (fi FileInfo, err error)

Lstat返回一个描述命名文件的文件信息。如果文件是一个符号链接,则返回的FileInfo描述这个符号链接。Lstat没有尝试跟踪该链接。如果有错误,它的类型是*PathError

(2).func ​​Stat​

func Stat(name string) (fi FileInfo, err error)

Stat返回一个描述命名文件的文件信息。如果有错误,它的类型是*PathError。

45.type ​​FileMode​

type FileMode uint32

文件模式表示文件的模式位和权限位。位在所有系统上具有相同的定义,因此有关文件的信息可以从一个系统移动到另一个系统。并不是所有的bits都适用于所有的系统。唯一需要的位是目录的ModeDir。

const (
// The single letters are the abbreviations
// used by the String method's formatting.
ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory
ModeAppend // a: append-only
ModeExclusive // l: exclusive use
ModeTemporary // T: temporary file (not backed up)
ModeSymlink // L: symbolic link
ModeDevice // D: device file
ModeNamedPipe // p: named pipe (FIFO)
ModeSocket // S: Unix domain socket
ModeSetuid // u: setuid
ModeSetgid // g: setgid
ModeCharDevice // c: Unix character device, when ModeDevice is set
ModeSticky // t: sticky

// Mask for the type bits. For regular files, none will be set.
ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice

ModePerm FileMode = 0777 // permission bits
)

定义的FileMode位是文件模式的最有效位。最低有效位是标准的Unix rwxrwxrwx权限。这些位的值应该被认为是公共API的一部分,并且可以在有线协议或磁盘表示中使用:它们不能被更改,尽管可能会添加新的位。

(1).func (FileMode) ​​IsDir​

func (m FileMode) IsDir() bool

IsDir报告m是否描述目录。也就是说,它测试m中是否设置了moddir位。

(2).func (FileMode) ​​IsRegular​

func (m FileMode) IsRegular() bool

IsRegular报告m是否描述常规文件。也就是说,它测试没有设置模式类型位。

(3).func (FileMode) ​​Perm​

func (m FileMode) Perm()

Perm返回m中的Unix权限位。

(4).func (FileMode) ​​String​

func (m FileMode) String() string

46.type ​​LinkError​

type LinkError struct {
Op string
Old string
New string
Err error
}

LinkError记录在链接、符号链接或重命名系统调用期间的错误以及导致错误的路径

(1).func (*LinkError) ​​Error​

func (e *LinkError) Error() string

47.type ​​PathError​

type PathError struct {
Op string
Path string
Err error
}

PathError记录错误以及导致错误的操作和文件路径。

(1).func (*PathError) ​​Error​

func (e *PathError) Error() string

48.type ​​ProcAttr​

type ProcAttr struct {
// If Dir is non-empty, the child changes into the directory before
// creating the process.
Dir string
// If Env is non-nil, it gives the environment variables for the
// new process in the form returned by Environ.
// If it is nil, the result of Environ will be used.
Env []string
// Files specifies the open files inherited by the new process. The
// first three entries correspond to standard input, standard output, and
// standard error. An implementation may support additional entries,
// depending on the underlying operating system. A nil entry corresponds
// to that file being closed when the process starts.
Files []*File

// Operating system-specific process creation attributes.
// Note that setting this field means that your program
// may not execute properly or even compile on some
// operating systems.
Sys *syscall.SysProcAttr
}

ProcAttr保存了将应用于由StartProcess启动的新进程的属性。

49.type ​​Process​

type Process struct {
Pid int
// contains filtered or unexported fields
}

Process存储StartProcess创建的进程信息.

(1).func ​​FindProcess​

func FindProcess(pid int) (p *Process, err error)

FindProcess根据进程的pid查找正在运行的进程。它返回的进程可用于获取有关底层操作系统进程的信息。

(2).func ​​StartProcess​

func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)

StartProcess使用程序、参数和由name、argv和attr指定的属性启动一个新进程。

StartProcess是一个低级接口。os/exec包提供了更高级的接口。

如果有错误,它的类型是*PathError。

(3).func (*Process) ​​Kill​

func (p *Process) Kill() error

Kill导致进程立即退出。

(4).func (*Process) ​​Release​

func (p *Process) Release() error

Release释放与流程p相关的所有资源,使其在未来不可用。只有在没有Wait的情况下才需要调用Release.

(5).func (*Process) ​​Signal​

func (p *Process) Signal(sig Signal) error

Signal向进程发送信号。在Windows上不实现发送中断

(6).func (*Process) ​​Wait​

func (p *Process) Wait() (*ProcessState, error)

Wait等待进程退出,然后返回描述其状态的ProcessState和错误(如果有的话)。Wait释放与该进程相关的所有资源。在大多数操作系统中,进程必须是当前进程的子进程,否则将返回错误。

50.type ​​ProcessState​

type ProcessState struct {
// contains filtered or unexported fields
}

ProcessState存储关于进程的信息,如Wait所报告的那样。

(1).func (*ProcessState) ​​Exited​

func (p *ProcessState) Exited() bool

Exited报告程序是否已经退出.

(2).func (*ProcessState) ​​Pid​

func (p *ProcessState) Pid() int

Pid返回退出进程的进程id.

(3).func (*ProcessState) ​​String​

func (p *ProcessState) String() string

(4).func (*ProcessState) ​​Success​

func (p *ProcessState) Success() bool

Success报告程序是否成功退出,例如在Unix上退出状态为0。

(5).func (*ProcessState) ​​Sys​

func (p *ProcessState) Sys() interface{}

返回与系统相关的进程退出信息。将其转换为适当的底层类型,例如系统调用。在Unix上的WaitStatus,以访问其内容。

(6).func (*ProcessState) ​​SysUsage​

func (p *ProcessState) SysUsage() interface{}

SysUsage返回与退出进程相关的系统资源使用信息。将其转换为适当的底层类型,例如*syscall。以访问它的内容。(在Unix系统调用。与getrusage(2)手册页中定义的struct Rusage匹配。)

(8).func (*ProcessState) ​​SystemTime​

func (p *ProcessState) SystemTime() time.Duration

SystemTime返回退出进程及其子进程的系统CPU时间.

(9).func (*ProcessState) ​​UserTime​

func (p *ProcessState) UserTime() time.Duration

UserTime返回退出的进程及其子进程的用户CPU时间。

51.type ​​Signal​

type Signal interface {
String() string
Signal() // to distinguish from other Stringers
}

一个信号代表一个操作系统信号。通常的底层实现是依赖于操作系统的:在Unix上是sycall.signal。

var (
Interrupt Signal = syscall.SIGINT
Kill Signal = syscall.SIGKILL
)

唯一保证在所有系统上存在的信号值是Interrupt(给进程发送一个中断)和Kill(强制进程退出)。

52.type ​​SyscallError​

type SyscallError struct {
Syscall string
Err error
}

SyscallError记录来自特定系统调用的错误。

(1).func (*SyscallError) ​​Error​

func (e *SyscallError) Error() string