1. 概述
os*PathError
type PathError struct {Op   stringPath stringErr  error
}
PathError
func (e *PathError) Error() string
2. type FileInfo
type FileInfo interface {Name() string       // 文件的名字(不含扩展名)Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同Mode() FileMode     // 文件的模式位ModTime() time.Time // 文件的修改时间IsDir() bool        // 等价于Mode().IsDir()Sys() interface{}   // 底层数据来源(可以返回nil)
}
FileInfo
func Stat(name string) (fi FileInfo, err error)
StatnameFileInfoFileInfo*PathError

代码示例:

package mainimport ("fmt""os"
)func main() {// Stat 返回一个描述 name 指定的文件对象的 FileInfofi, err := os.Stat("./test.txt")if err != nil {fmt.Println(err)}fileName := fi.Name()fileSize := fi.Size()fileMode := fi.Mode()fileModTime := fi.ModTime()isDir := fi.IsDir()fileSys := fi.Sys()fmt.Printf("fileName is %#v\n", fileName)fmt.Printf("fileSize is %#v\n", fileSize)fmt.Printf("fileMode is %#v\n", fileMode)fmt.Printf("fileModTime is %#v\n", fileModTime)fmt.Printf("isDir is %#v\n", isDir)fmt.Printf("fileSys is %#v\n", fileSys)
}
3. type FileMode
FileModel
type FileMode uint32
FileModeModeDir
函数定义函数说明
func (m FileMode) IsDir() boolIsDir报告m是否是一个目录
func (m FileMode) IsRegular() boolIsRegular报告m是否是一个普通文件
func (m FileMode) Perm() FileModePerm方法返回m的Unix权限位
func (m FileMode) String() string返回m的字符串表示

使用示例:

func main() {// Stat 返回一个描述 name 指定的文件对象的 FileInfofi, err := os.Stat("./test.log")if err != nil {fmt.Println(err)}fm := fi.Mode()	// 返回 FileMode fmt.Println(fm.IsDir())     // falsefmt.Println(fm.IsRegular()) // truefmt.Println(fm.Perm())      // -rw-rw----fmt.Println(fm.String())    // -rw-rw----
}

实际文件显示:

wohu@wohu:~/GoCode/src/task$ ll
total 20
-rw-rw-r--  1 wohu wohu  250 5月  20 09:40 main.go
-rw-rw----  1 wohu wohu    0 5月  15 10:54 test.log
4. 主要函数

4.1 os.Hostname、Exit、Getpid、Getppid、

函数定义函数说明
func Hostname() (name string, err error)Hostname返回内核提供的主机名。
func Environ() []stringEnviron返回表示环境变量的格式为"key=value"的字符串的切片拷贝
func ExpandEnv(s string) string根据当前环境变量的值替换字符串中的 ${var} 或 $var。对未定义变量的引用将被空字符串替换
func Getenv(key string) stringGetenv检索并返回名为key的环境变量的值。如果不存在该环境变量会返回空字符串,要区分空值和未设置值,请使用 LookupEnv
func LookupEnv(key string) (string, bool)检索 key 这个键对应的环境变量的值,如果该环境变量存在,则返回对应的值(可能为空),并且布尔值为 true,否则,返回值将为空,布尔值将为 false
func Setenv(key, value string) errorSetenv设置名为key的环境变量。如果出错会返回该错误
func Unsetenv(key string) error取消设置单个环境变量
func Clearenv()Clearenv删除所有环境变量(谨慎使用)
func Exit(code int)Exit让当前程序以给出的状态码code退出。一般来说,状态码0表示成功,非0表示出错。 程序会立刻终止,defer的函数不会被执行
func Getuid() intGetuid返回调用者的用户ID
func Geteuid() intGeteuid返回调用者的有效用户ID
func Getgid() intGetgid返回调用者的组ID
func Getegid() intGetegid返回调用者的有效组ID
func Getgroups() ([]int, error)Getgroups返回调用者所属的所有用户组的组ID
func Getpid() intGetpid返回调用者所在进程的进程ID
func Getppid() intGetppid返回调用者所在进程的父进程的进程ID

使用示例:

func main() {hostname, err := os.Hostname()if err != nil {fmt.Println(err)}env := os.Environ()goroot := os.Getenv("GOROOT")name := os.Getenv("NAME")fmt.Println("name is:", name)pid := os.Getpid()ppid := os.Getppid()os.Exit(0)fmt.Println(hostname)fmt.Println(env)fmt.Println(goroot)fmt.Println(pid)fmt.Println(ppid)
}

执行:

$ NAME=wohu go run main.go
name is: wohu 

示例

host := os.ExpandEnv("127.0.0.1:$PORT")
fmt.Println(host)
$PORTos.Getenv("PORT")

4.2 os.IsExist

func IsExist(err error) bool
ErrExist

4.3 os.IsNotExist

func IsNotExist(err error) bool
ErrNotExist

4.4 os.IsPermission

func IsPermission(err error) bool
ErrPermission

4.5 os.Getwd

func Getwd() (dir string, err error)
Getwd

4.5 os.Chdir

func Chdir(dir string) error
dir*PathError

代码示例如下:

func main() {_, err := os.Stat("./test.log")if os.IsExist(err) {fmt.Println("test.log do not exist")}if os.IsNotExist(err) {fmt.Println("test.log exist")}curDir, err := os.Getwd()if err != nil {fmt.Println(err)}fmt.Println(curDir) // /home/wohu/GoCode/src/taskerr = os.Chdir("/opt/")if err != nil {fmt.Println(err)}chDir, err := os.Getwd()if err != nil {fmt.Println(err)}fmt.Println(chDir) // opt
}

4.6 os.Chmod

func Chmod(name string, mode FileMode) error
namemodenamemode*PathError

代码示例:

func main() {// Stat 返回一个描述 name 指定的文件对象的 FileInfofi, err := os.Stat("./test.log")if err != nil {fmt.Println(err)}fm := fi.Mode() // 返回 FileModefilePerm := fm.Perm()fmt.Println(filePerm) // 修改前权限为  -rw-rw----err = os.Chmod("./test.log", 0755)if err != nil {fmt.Println(err)}fi, err = os.Stat("./test.log")if err != nil {fmt.Println(err)}filePerm = fm.Perm()fmt.Println(filePerm) // 修改后权限为  -rwxr-xr-x
}

4.7 os.Chown

func Chown(name string, uid, gid int) error
nameididnameidid*PathError

4.8 os.Getgroups

func Getgroups() ([]int, error)groupchowngroup

代码示例:

func main() {fmt.Println(os.Getgroups())                //获取调用者属于的组  [4 24 27 30 46 108 124 1000]fmt.Println(os.Getgid())                   //获取调用者当前所在的组 1000fmt.Println(os.Chown("tmp.txt", 1000, 46)) //更改文件所在的组
}

4.9 os.Mkdir

func Mkdir(name string, perm FileMode) error
*PathError

4.10 os.MkdirAll

func MkdirAll(path string, perm FileMode) error
nilpermpathMkdirAllnil

代码示例:

func main() {errMsg := os.Mkdir("./testDir", 0775)if errMsg != nil {fmt.Println("创建目录失败", errMsg)return}errMsg2 := os.MkdirAll("./a/b", 0775)if errMsg2 != nil {fmt.Println("创建目录失败", errMsg2)return}
}

4.11 os.Rename

func Rename(oldpath, newpath string) error

修改一个文件的名字,移动一个文件。可能会有一些个操作系统特定的限制。

4.12 os.Remove

func Remove(name string) error
name*PathError

4.13 os.RemoveAll

func RemoveAll(path string) error
pathpathRemoveAllnil

示例代码如下:

func main() {err := os.Rename("a", "b")if err != nil {fmt.Println(err)}err = os.Remove("./b")if err != nil {fmt.Println(err)}err = os.RemoveAll("./b")if err != nil {fmt.Println(err)}
}
5. type file
type File struct {// 内含隐藏或非导出字段
}
File

5.1 返回文件对象的函数

5.1.1 os.Create

func Create(name string) (file *File, err error)
CreatenameI/OO_RDWR*PathError

5.1.2 os.Open

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

该函数只能以只读模式打开文件。换句话说,我们只能从该函数返回的File值中读取内容,而不能向它写入任何内容。

5.1.3 os.OpenFile

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
OpenFileOpenCreateO_RDONLY0666I/O*PathError
os.Createos.OpennameflagpermnameflagGoos.O_RDONLYint

5.1.4 os.NewFile

func NewFile(fd uintptr, name string) *File
NewFileUnixuintptr
File
File
file3 := os.NewFile(uintptr(syscall.Stderr), "/dev/stderr")if file3 != nil {defer file3.Close()file3.WriteString("The Go language program writes the contents into stderr.\n")
}

5.2 文件对象的方法

func (f *File) Name() string
NameOpen/Create
func (f *File) Stat() (fi FileInfo, err error)
StatfFileInfo*PathError
func (f *File) Fd() uintptr
FdfUnix
func (f *File) Chdir() error
Chdirff*PathError
func (f *File) Chmod(mode FileMode) error
Chmod*PathError
func (f *File) Chown(uid, gid int) error
ChownIDID*PathError
func (f *File) Readdir(n int) (fi []FileInfo, err error)
Readdirfn[]FileInfoFileInfoLstat
n>0ReaddirnReaddirnilferrio.EOF
n<=0ReaddirFileInfoReaddirnilFileInfo
func (f *File) Readdirnames(n int) (names []string, err error)
Readdirnamesf
n>0ReaddirnamesnReaddirnamesEOF
n<0ReaddirnamesReaddirnamesnames
func (f *File) Truncate(size int64) error
TruncateI/O*PathError
func (f *File) Read(b []byte) (n int, err error)
Readflen(b)berrio.EOF
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAtlen(b)bn
func (f *File) Write(b []byte) (n int, err error)
Writelen(b)n!=len(b)nil
func (f *File) WriteString(s string) (ret int, err error)
WriteStringWrite
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
WriteAtlen(b)n!=len(b)nil
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
Seek
6. 用于File值的操作模式
Fileos.O_RDONLYos.O_WRONLYos.O_RDWR

在我们新建或打开一个文件的时候,必须把这三个模式中的一个设定为此文件的操作模式。除此之外,我们还可以为这里的文件设置额外的操作模式,可选项如下所示。

os.O_APPENDos.O_CREATEos.O_EXCLos.O_CREATEos.O_SYNCI/Oos.O_TRUNC
os.Createos.Open
func Create(name string) (*File, error) { return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
os.Createos.OpenFileos.O_RDWRos.O_CREATEos.O_TRUNC
nameFile

这里需要注意,多个操作模式是通过按位或操作符|组合起来的。

func Open(name string) (*File, error) {return OpenFile(name, O_RDONLY, 0)
}
os.Openos.OpenFileos.O_RDONLY
7. 设定常规文件的访问权限
os.OpenFilepermos.FileMode
os.FileMode
os.FileModeuint32
os.ModeDiros.ModeNamedPipe
os.FileModeFileModeos.ModePermFileMode
FileModePerm
os.OpenFile

但要注意,只有在新建文件的时候,这里的第三个参数值才是有效的。在其他情况下,即使我们设置了此参数,也不会对目标文件产生任何的影响。

8. os 中关于进程的操作

进程

参考:

https://studygolang.com/pkgdoc
https://www.cnblogs.com/sunailong/p/7554013.html
https://blog.csdn.net/weiyuefei/article/details/77892871