Go——os包详解(一)

目录

os包详解

Go语言的os包中提供了操作系统函数的接口,是一个比较重要的包。顾名思义,os包的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。

函数列表:

func Chdir(dir string) error
func Chmod(name string, mode FileMode) error
func Chown(name string, uid, gid int) error
func Chtimes(name string, atime time.Time, mtime time.Time) error
func Clearenv()
func Environ() []string
func Exit(code int)
func Expand(s string, mapping func(string) string) string
func ExpandEnv(s string) string
func Getegid() int
func Getenv(key string) string
func Geteuid() int
func Getgid() int
func Getgroups() ([]int, error)
func Getpagesize() int
func Getpid() int
func Getppid() int
func Getuid() int
func Getwd() (pwd string, err error)
func Hostname() (name string, err error)
func IsExist(err error) bool
func IsNotExist(err error) bool
func IsPathSeparator(c uint8) bool
func IsPermission(err error) bool
func Lchown(name string, uid, gid int) error
func Link(oldname, newname string) error
func Mkdir(name string, perm FileMode) error
func MkdirAll(path string, perm FileMode) error
func NewSyscallError(syscall string, err error) error
func Readlink(name string) (string, error)
func Remove(name string) error
func RemoveAll(path string) error
func Rename(oldname, newname string) error
func SameFile(fi1, fi2 FileInfo) bool
func Setenv(key, value string) error
func Symlink(oldname, newname string) error
func TempDir() string
func Truncate(name string, size int64) error
func Create(name string) (file *File, err error)
func NewFile(fd uintptr, name string) *File
func Open(name string) (file *File, err error)
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
func Pipe() (r *File, w *File, err error)
func (f *File) Chdir() error
func (f *File) Chmod(mode FileMode) error
func (f *File) Chown(uid, gid int) error
func (f *File) Close() error
func (f *File) Fd() uintptr
func (f *File) Name() string
func (f *File) Read(b []byte) (n int, err error)
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
func (f *File) Readdir(n int) (fi []FileInfo, err error)
func (f *File) Readdirnames(n int) (names []string, err error)
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
func (f *File) Stat() (fi FileInfo, err error)
func (f *File) Sync() (err error)
func (f *File) Truncate(size int64) error
func (f *File) Write(b []byte) (n int, err error)
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
func (f *File) WriteString(s string) (ret int, err error)
func Lstat(name string) (fi FileInfo, err error)
func Stat(name string) (fi FileInfo, err error)
func (m FileMode) IsDir() bool
func (m FileMode) Perm() FileMode
func (m FileMode) String() string
func (e *LinkError) Error() string
func (e *PathError) Error() string
func FindProcess(pid int) (p *Process, err error)
func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)
func (p *Process) Kill() error
func (p *Process) Release() error
func (p *Process) Signal(sig Signal) error
func (p *Process) Wait() (*ProcessState, error)
func (p *ProcessState) Exited() bool
func (p *ProcessState) Pid() int
func (p *ProcessState) String() string
func (p *ProcessState) Success() bool
func (p *ProcessState) Sys() interface{}
func (p *ProcessState) SysUsage() interface{}
func (p *ProcessState) SystemTime() time.Duration
func (p *ProcessState) UserTime() time.Duration
func (e *SyscallError) Error() string

1、Ch系列函数

1.1 func Chdir(dir string) error
  • 参数列表
    • dir 目录路径
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是改变当前工作目录
1.2 func Chmod(name string, mode FileMode) error
  • 参数列表
    • name 修改的文件名
    • mode 文件修改的目标模式
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是修改一个文件的模式,如果文件为一个链接,修改的则是链接的目标文件
1.3 func Chown(name string, uid, gid int) error
  • 参数列表
    • name 修改的文件名
    • uid 用户id
    • gid 用户组id
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是修改一个文件的所属用户和用户组,如果文件为一个链接,修改的则是链接的目标文件
1.4 func Chtimes(name string, atime time.Time, mtime time.Time) error
  • 参数列表
    • name 修改的文件名
    • atime 访问时间
    • mtime 修改时间
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是修改一个文件的访问时间和修改时间
func main() {
	chdirTest()
	chmodTest()
	chownTest()
	chtimesTest()
}

func chtimesTest() {
	fi, err := os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Hello.go: atime=%+v, mtime=%v\n", fi.Sys().(*syscall.Stat_t).Atimespec, fi.ModTime())

	err = os.Chtimes("Hello.go", time.Now(), time.Now())
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}

	fi, err = os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now Hello.go: atime=%+v, mtime=%v\n", fi.Sys().(*syscall.Stat_t).Atimespec, fi.ModTime())
}

func chownTest() {
	fi, err := os.Stat("a.txt")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("a.txt: uid=%d, gid=%d\n", fi.Sys().(*syscall.Stat_t).Uid, fi.Sys().(*syscall.Stat_t).Gid)
	//a.txt: uid=501, gid=20

	err = os.Chown("a.txt", 99, 99) //nobody, nobody
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}

	fi, err = os.Stat("a.txt")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now a.txt: uid=%d, gid=%d\n", fi.Sys().(*syscall.Stat_t).Uid, fi.Sys().(*syscall.Stat_t).Gid)
	//Now a.txt: uid=99, gid=99
}

func chmodTest() {
	fi, err := os.Stat("a.txt")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("a.txt's mode is: %s(%o)\n", fi.Mode(), fi.Mode()&0777)
	//a.txt's mode is: -rw-r--r--(644)

	err = os.Chmod("a.txt", 0777)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}

	fi, err = os.Stat("a.txt")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now a.txt's mode is: %s(%o)\n", fi.Mode(), fi.Mode()&0777)
	//Now a.txt's mode is: -rwxrwxrwx(777)
}

func chdirTest() {
	pwd, err := os.Getwd()
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("The current directory is: %s\n", pwd) //The current directory is: /Users/acton_zhang/go/gobook

	if err = os.Chdir("go-study"); err != nil {
		fmt.Printf("Error: %s\n", err) //Error: chdir go-study: no such file or directory
		return
	}

	pwd, err = os.Getwd()
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now the current directory is: %s\n", pwd)
}

2、File系列函数

2.1 func (f *File) Chdir() error
  • 参数列表: 无
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是改变当前工作目录,f必须是一个目录的信息
2.2 func (f *File) Chmod(mode FileMode) error
  • 参数列表
  • mode 文件修改的目标模式
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是修改文件的模式
2.3 func (f *File) Chown(uid, gid int) error
  • 参数列表
    • uid 用户id
    • gid 用户组id
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是修改文件的所属用户和用户组
func main() {
	fileChdirTest()
	fileChmod()
	fileChown()
}

func fileChown() {
	fi, err := os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Hello.go: uid=%d, gid=%d\n", fi.Sys().(*syscall.Stat_t).Uid, fi.Sys().(*syscall.Stat_t).Gid)

	f, _ := os.Open("Hello.go")
	err = f.Chown(99, 99) //nobody, nobody
	if err != nil {
		fmt.Printf("Error: %s\n", err)
	}
	f.Close()

	fi, err = os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now Hello.go: uid=%d, gid=%d\n", fi.Sys().(*syscall.Stat_t).Uid, fi.Sys().(*syscall.Stat_t).Gid)
}

func fileChmod() {
	fi, err := os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Hello.go's mode is: %s(%o)\n", fi.Mode(), fi.Mode()&0777)

	f, _ := os.Open("Hello.go")
	err = f.Chmod(0777)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
	}
	f.Close()

	fi, err = os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now Hello.go's mode is: %s(%o)\n", fi.Mode(), fi.Mode()&0777)
}

func fileChdirTest() {
	pwd, err := os.Getwd()
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("The current directory is: %s\n", pwd)

	f, _ := os.Open("World")
	if err = f.Chdir(); err != nil {
		fmt.Printf("Error: %s\n", err)
	}

	pwd, err = os.Getwd()
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now the current directory is: %s\n", pwd)
}
2.4 func (f *File) Close() error
  • 参数列表:无
  • 返回值:返回error 返回错误信息对象
  • 功能说明:这个函数主要是关闭文件指针
2.5 func Create(name string) (file *File, err error)
  • 参数列表
    • name 文件名
  • 返回值:
    • file 文件指针
    • error 返回错误信息对象
  • 功能说明:这个函数主要是创建一个文件,此方法会覆盖已存在的文件
2.6 func (f *File) Fd() uintptr
  • 参数列表:无
  • 返回值:返回unitptr 返回文件句柄
  • 功能说明:这个函数主要是获取文件句柄
2.7 func (f *File) Name() string
  • 参数列表:无
  • 返回值:返回string 返回文件名
  • 功能说明:这个函数主要是获取文件名
2.8 func NewFile(fd uintptr, name string) *File
  • 参数列表
    • fd 文件句柄
    • name 文件名
  • 返回值:
    • file 文件指针
  • 功能说明:这个函数主要是新建一个文件(但不保存),返回文件指针
2.9 func Open(name string) (file *File, err error)
  • 参数列表
    • name 文件名
  • 返回值:
    • file 文件指针
    • error 返回错误信息对象
  • 功能说明:这个函数主要是以只读的模式打开一个文件
2.10 func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
  • 参数列表
    • name 文件名
    • flag 文件打开方式
    • perm 文件权限
  • 返回值:
    • file 文件指针
    • error 返回错误信息对象
  • 功能说明:这个函数主要是打开一个文件,方式和权限通过参数控制
func main() {
	fi, err := os.Open("a.txt")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
	}
	if err = fi.Close(); err != nil {
		fmt.Printf("Error: %s\n", err)
	}
	fmt.Printf("fi has been closed!")

	fi, err = os.Create("Hello.go")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	defer fi.Close()
	fmt.Printf("The %s has been created!\n", fi.Name())

	fi, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	fmt.Printf("%v\n", fi.Fd())

	fi, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	fmt.Printf("The file name is: %v\n", fi.Name())

	fi, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	defer fi.Close()
	file := os.NewFile(fi.Fd(), "World.go")
	defer file.Close()
	fmt.Printf("The %s has been new!\n", file.Name())

	fi, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	defer fi.Close()
	data := make([]byte, 100)
	fi.Read(data)
	fmt.Printf("The %s's content is: %s \n", fi.Name(), data)

	fi, err = os.OpenFile("Hello.go", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0777)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	defer fi.Close()
	data = make([]byte, 100)
	fi.Read(data)
	fmt.Printf("The %s's content is: %s \n", fi.Name(), data)
	fi.WriteString("come on!!\n")
	fi.Seek(0, 0)
	fi.Read(data)
	fmt.Printf("Now the %s's content is: %s \n", fi.Name(), data)
}
2.11 func Pipe() (r *File, w *File, err error)
  • 参数列表:无
  • 返回值:
    • r 只读文件指针
    • w 只写文件指针
    • error 返回错误信息对象
  • 功能说明:这个函数主要是获取一对文件指针,一个只读(如:stdout),一个只写(如:stdin)
2.12 func (f *File) Read(b []byte) (n int, err error)
  • 参数列表
    • []byte 存储读取内容的byte slice
  • 返回值:
    • 返回int 返回读取文件内容的字节长度
    • 返回error 返回error错误对象
  • 功能说明:这个函数主要是读取文件内容到[]byte
2.13 func (f *File) ReadAt(b []byte, off int64) (n int, err error)
  • 参数列表
    • []byte 存储读取内容的byte slice
    • int64 开始读取内容的下标,单位是byte
  • 返回值:
    • 返回int 返回读取文件内容的字节长度
    • 返回error 返回error错误对象
  • 功能说明:这个函数主要是从文件的某处开始读取内容到[]byte
2.14 func (f *File) Readdir(n int) (fi []FileInfo, err error)
  • 参数列表
    • int 需要取出的文件信息数
  • 返回值:
    • 返回[]FileInfo 返回文件目录中文件的信息slice
    • 返回error 返回error错误对象
  • 功能说明:这个函数主要是读取目录下的文件信息,如果参数n>0,则读取min(n, 文件夹下的文件数目)个文件信息,如果n<=0,则读取文件夹下所有的文件信息
2.15 func (f *File) Seek(offset int64, whence int) (ret int64, err error)
  • 参数列表
    • offset 文件指针的位置
    • whence 相对位置标识
  • 返回值:
    • 返回ret 返回文件指针的位置
    • 返回err 返回error错误对象
  • 功能说明:这个函数主要是把文件指针移动到文件的指定位置,whence为0时代表相对文件开始的位置,1代表相对当前位置,2代表相对文件结尾的位置
2.16 func (f *File) Stat() (fi FileInfo, err error)
  • 参数列表:无
  • 返回值:
    • 返回fi 返回文件的信息
    • 返回err 返回error错误对象
  • 功能说明:这个函数主要是获取文件信息
2.17 func (f *File) Sync() (err error)
  • 参数列表:无
  • 返回值:返回err 返回error错误对象
  • 功能说明:这个函数主要是把f内存里的内容写到磁盘上,即使是断电或系统崩溃,也能做到数据不丢失(注:一般不用调用这个方法)
2.18 func (f *File) Truncate(size int64) error
  • 参数列表
    • size 截断后的大小
  • 返回值:
    • 返回error 返回error错误对象
  • 功能说明:这个函数主要是把文件截断到指定大小
2.19 func (f *File) Write(b []byte) (n int, err error)
  • 参数列表
    • b 要写入的内容
  • 返回值:
    • 返回int 返回写入的字节数
    • 返回err 返回error错误对象
  • 功能说明:这个函数主要是往一个文件里写入内容
2.20 func (f *File) WriteAt(b []byte, off int64) (n int, err error)
  • 参数列表
    • b 要写入的内容
    • off 要写入的位置
  • 返回值:- 返回int 返回写入的字节数
    • 返回err 返回error错误对象
  • 功能说明:这个函数主要是往一个文件的指定位置开始写入内容
2.21 func (f *File) WriteString(s string) (ret int, err error)
  • 参数列表
    • s 要写入的内容
  • 返回值:
    • 返回ret 返回写入的字节数
    • 返回err 返回error错误对象
  • 功能说明:这个函数主要是往一个文件里写入内容
func main() {
	r, w, err := os.Pipe()
	//Read *Files: &{file:0xc42008a0f0}, Write *Files: &{file:0xc42008a140}, err: <nil>
	fmt.Printf("Read *Files: %+v, Write *Files: %+v, err: %v\n", r, w, err)

	b := make([]byte, 10)
	fi, err := os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	n, _ := fi.Read(b)
	fmt.Printf("%d\n", n)
	fmt.Printf("%s\n", b[:n])

	b = make([]byte, 10)
	fi, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	n, _ = fi.ReadAt(b, 3)
	fmt.Printf("%d\n", n)
	fmt.Printf("%s\n", b[:n])

	fi, err = os.Open("src/os_pro")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	ff, _ := fi.Readdir(10)
	for i, f := range ff {
		fmt.Printf("fileinfo %d: %+v\n", i, f)
	}

	b = make([]byte, 10)
	fi, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	fi.Seek(3, 0)
	n, _ = fi.Read(b)
	fmt.Printf("%d\n", n)
	fmt.Printf("%s\n", b[:n])

	fi, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	f, _ := fi.Stat()
	fmt.Printf("file info: %+v\n", f)

	fi, err = os.OpenFile("Hello.go", os.O_RDWR, 0420)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	f, _ = fi.Stat()
	fmt.Printf("file size: %+v\n", f.Size())
	fi.Truncate(6)
	f, _ = fi.Stat()
	fmt.Printf("now file size: %+v\n", f.Size())

	b = make([]byte, 10)
	fi, err = os.OpenFile("Hello.go", os.O_RDWR|os.O_APPEND, 0420)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	n, _ = fi.Read(b)
	fmt.Printf("len: %d, file content: %s\n", n, b[:n])
	fi.Write([]byte("cc\n"))
	fi.Seek(0, 0)
	n, _ = fi.Read(b)
	fmt.Printf("now len: %d, file content: %s\n", n, b[:n])

	b = make([]byte, 10)
	fi, err = os.OpenFile("Hello.go", os.O_RDWR, 0420)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	n, _ = fi.Read(b)
	fmt.Printf("len: %d, file content: %s\n", n, b[:n])
	fi.Seek(0, 0)
	fi.WriteAt([]byte("cc\n"), 3)
	fi.Seek(0, 0)
	n, _ = fi.Read(b)
	fmt.Printf("now len: %d, file content: %s\n", n, b[:n])

	b = make([]byte, 20)
	fi, err = os.OpenFile("Hello.go", os.O_RDWR|os.O_APPEND, 0420)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer fi.Close()
	n, _ = fi.Read(b)
	fmt.Printf("len: %d, file content: %s\n", n, b[:n])
	fi.WriteString("Hello World!\n")
	fi.Seek(0, 0)
	n, _ = fi.Read(b)
	fmt.Printf("now len: %d, file content: %s\n", n, b[:n])
}
2.22 func Lstat(name string) (fi FileInfo, err error)
  • 参数列表
    • name 文件名
  • 返回值:
    • 返回fi 文件信息结构体
    • 返回err 返回error错误对象
  • 功能说明:这个函数主要是获取一个文件的信息,如果这个文件是一个链接,返回的是链接本身的信息
2.23 func Stat(name string) (fi FileInfo, err error)
  • 参数列表
    • name 文件名
  • 返回值:
    • 返回fi 文件信息结构体
    • 返回err 返回error错误对象
  • 功能说明:这个函数主要是获取一个文件的信息,如果这个文件是一个链接,返回的是目标文件的信息
2.24 func (m FileMode) IsDir() bool
  • 参数列表:无
  • 返回值:返回bool
  • 功能说明:这个函数主要是判断一个文件模式是否为文件夹
2.25 func (m FileMode) Perm() FileMode
  • 参数列表:无
  • 返回值:
    • 返回FileMode 返回Unix权限
  • 功能说明:这个函数主要是获取一个文件模式的Unix权限
2.26 func (m FileMode) String() string
  • 参数列表:无
  • 返回值:
    • 返回string 返回文件模式的字符串形式
  • 功能说明:这个函数主要是获取文件模式的字符串形式
func main() {
	fi, err := os.Lstat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("file info: %+v\n", fi)

	fi, err = os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("file info: %+v\n", fi)

	f, err := os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer f.Close()
	fi, _ = f.Stat()
	fmt.Printf("%s is dir?: %t\n", fi.Name(), fi.Mode().IsDir())

	f, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer f.Close()
	fi, _ = f.Stat()
	fmt.Printf("%s mode: %v\n", fi.Name(), fi.Mode().Perm()&0777)

	f, err = os.Open("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	defer f.Close()
	fi, _ = f.Stat()
	fmt.Printf("%s mode: %v\n", fi.Name(), fi.Mode().String())
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值