go语言中os包的用法实战大全

来自:网络
时间:2024-03-30
阅读:
免费资源网 - https://freexyz.cn/

前言

Go语言中的os包是操作系统包,提供了丰富的函数和方法用于与操作系统进行交互。本文将介绍一些常用的os包函数和方法,包括文件操作、进程管理、环境变量管理等。

一、文件权限符号

介绍os包之前我们先介绍一下文件权限。

1.1、定义

在 Golang 中,文件权限由三组数字表示,分别表示文件所有者、组成员和其他用户。每组数字由三个数字组成,分别表示读、写和执行权限。数字 0 表示没有权限,数字 4 表示有读权限,数字 2 表示有写权限,数字 1表示有执行权限。

因此,0666 表示所有用户都有读、写权限。

以下是文件权限的完整表格:

权限所有者组成员其他用户
444
222
执行111

1.2、POSIX标准

POSIX(Portable Operating System Interface for Unix)是一种定义了操作系统交互接口的标准,旨在确保在不同操作系统上的程序具有一致的行为。在POSIX标准中,文件权限通常以八进制数字表示,并且在数字前面加上一个"0"。
因此,为了遵循POSIX标准并与其他系统兼容,Go语言中的os.Stat函数将文件权限设置为0666而不是直接使用666。这样可以确保在不同的操作系统上都能正确地解析和处理文件权限。

三、os包

3.1、获取文件/文件夹信息

Stat(name string) (FileInfo, error)
Lstat(name string) (FileInfo, error)
IsExist(err error) bool // 指示是否已知错误以报告文件或目录已存在。
IsNotExist(err error) bool // 是否已知错误以报告文件或目录不存在。
IsPermission(err error) bool // 是否已知错误以报告权限被拒绝。
IsTimeout(err error) bool // 是否已知错误以报告发生了超时。
NewSyscallError(syscall string, err error) error // 以错误的形式返回一个新的 SyscallError,包含给定的系统调用名称和错误详细信息
//如果传入的是一个符号链接,那么Lstat只返回该符号链接,不会跟踪,其他没区别。

返回FileInfo对象和error,如果报错说明传入的路径不合法/不存在。FileInfo对象包含文件的一些信息:

// FileInfo 描述一个文件,由 Stat 返回。
type FileInfo interface {
	Name() string       // 文件的基本名称
	Size() int64        // 常规文件的长度(以字节为单位);系统依赖于他人
	Mode() FileMode     // 文件模式位
	ModTime() time.Time // 修改时间
	IsDir() bool        // Mode().IsDir()的缩写。
	Sys() any           // 基础数据源(可以返回nil)
}

3.1.1、测试

package main

import (
	"fmt"
	"os"
)

func main() {
	path := "D:/config/test/test.txt"
	stat, _ := os.Stat(path)
	fmt.Println("stat.Name():", stat.Name())
	fmt.Println("stat.Size():", stat.Size())
	fmt.Println("stat.Mode():", stat.Mode())
	fmt.Println("stat.ModTime():", stat.ModTime())
	fmt.Println("stat.IsDir():", stat.IsDir())
	fmt.Println("stat.Sys():", stat.Sys())
}

3.1.2、输出

stat.Name(): test.txt
stat.Size(): 0                                                                         
stat.Mode(): -rw-rw-rw-                                                                
stat.ModTime(): 2023-12-19 10:26:07.3735891 +0800 CST                                  
stat.IsDir(): false                                                                    
stat.Sys(): &{32 {3102608083 31076898} {3102608083 31076898} {3102608083 31076898} 0 0}

3.2、创建文件

Create

Create(name string) (*File, error)   // 创建文件,文件存在则覆盖,底层调用的是OpenFile
  • 创建的文件默认权限为0666,所有用户都具有读写权限
  • 以读写方式创建文件,如果文件已存在,则覆盖。

返回*File指针对象和error,使用File对象,可以对文件进行读写操作。

CreateTemp

CreateTemp(dir, pattern string) (*File, error)
  • 创建一个临时文件,dir如果为空,则使用本地的临时文件路径,pattern为临时文件名前缀
  • dir为目录名

3.3、打开文件

Open(name string) (*File, error)  //以只读方式打开文件
OpenFile(name string, flag int, perm FileMode) (*File, error) // 打开或创建文件

Open方法

  • 以只读方式打开文件,返回的File对象,可以调用指定读操作的方法,不能调用写操作方法

OpenFile方法

文件操作方式 中文释义 注意事项
O_RDONLY 只读 不能和O_WRONLY、O_RDWR一起使用
O_WRONLY 只写 不能和O_RDONLY、O_RDWR一起使用
O_RDWR 读写 不能和O_WRONLY、O_WRONLY一起使用
O_APPEND 追加 和上边三个之一进行或运算传值,创建文件时,如果文件存在,则不会覆盖
O_CREATE 创建 和上边三个之一进行或运算传值
O_EXCL 强制 与 O_CREATE 一起使用时,文件不能存在
O_SYNC 同步 打开以进行同步I/O。
O_TRUNC 存在则覆盖 打开时截断常规可写文件。

3.3.1、测试

打开一个文件,如果文件不存在则创建,默认不会覆盖

path := "D:/config/test/test.txt"
	//打开文件,如果文件不存在,则创建
	file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("创建文件失败:", err)
		return
	}
	fmt.Println(file)

3.4、写文件

WriteFile(name string, data []byte, perm FileMode) error
//写文件,底层调用OPenFile,以只写方式打开文件,如果文件存在,则覆盖,不存在则创建
  • 写文件,底层调用OPenFile,以只写方式打开文件,如果文件存在,则覆盖,不存在则创建
  • 底层调用的是File对象的Write方法写文件。

3.5、读文件

ReadFile(name string) ([]byte, error) 
  • 读取整个文件并返回字节数组,error == nil代表读取成功。
  • 底层先调用Open以只读方式打开文件,
  • 再调用Read方法读取文件所有内容。

3.6、移动/重命名文件/目录

Rename(oldpath, newpath string) error
  • 文件和文件夹都可以移动

3.7、删除文件或目录

Remove(name string) error // 删除文件
RemoveAll(path string) error //删除目录
// 删除路径及其包含的所有子路径。它会删除它能删除的所有内容,不存在不会报错

不存在会报错

3.8、创建目录

Mkdir

Mkdir(name string, perm FileMode) error
  • 创建一个具有指定名称和权限位的新目录
  • 底层调用的是syscall
  • 如果目录已经存在,则报错
  • 如果父目录不存在,则报错

MkdirAll

MkdirAll(path string, perm FileMode) error
  • 递归方式创建目录,如果父级目录不存在,则先创建父级目录
  • 底层调用的是Mkdir哈函数。
  • 如果目录已经存在,不会报错。

创建临时目录-MkdirTemp

MkdirTemp(dir, pattern string) (string, error)
  • 在你传入的dir目录下创建一个临时目录,pattern代表临时目录的前缀。
  • 如果dir传空,则默认为本机的临时目录路径
  • 底层调用Mkdir,权限0700。

3.9、更改文件/目录权限

Chmod(name string, mode FileMode) error

3.10、获取文件系统fs对象

DirFS(dir string) fs.FS
  • 传入一个文件路径,返回fs对象,fs代表当前路径
  • fs有Open方法可以用来打开文件或目录

3.11、获取目录下的所有文件

ReadDir(name string) ([]DirEntry, error)
  • 获取到所有文件和文件夹

返回的DirEntry对象如下:

// DirEntry 是从目录读取的条目(使用 ReadDir
// 函数或 ReadDirFile 的 ReadDir 方法)
type DirEntry interface {
	// Name 返回条目所描述的文件(或子目录)的名称。此名称只是路径的最后一个
	// 元素(基本名称),而不是整个路径。例如,name将返回“hello.go”,
	// 而不是“ home/gopher/hello.go ”。
	Name() string

	// IsDir 报告条目是否描述目录。
	IsDir() bool

	// Type 返回条目的类型位。类型位是由 FileMode.Type
	// 方法返回的常见 FileMode 位的子集。
	Type() FileMode

	// Info 返回条目所描述的文件或子目录的 FileInfo。
	// 返回的 FileInfo 可以是读取原始目录的时间,也可
	// 以是调用 Info 的时间。如果文件在目录读取后已被删除或重
	// 命名,则 Info 可能会返回满足 errors.is(err,ErrNotExist)的错误。
	// 如果条目表示符号链接,
	// 则 Info 报告有关链接本身的信息,而不是链接的目标
	Info() (FileInfo, error)
}

测试

func main() {
	path := "D:\\software"
	dir, err := os.ReadDir(path)
	if err != nil {
		fmt.Println(err)
		return
	}
	for i := 0; i < len(dir); i++ {
		fmt.Println(dir[i].Name())
		fmt.Println(dir[i].IsDir())
		fmt.Println(dir[i].Info())
		fmt.Println(dir[i].Type())
	}
}

3.12、修改文件大小

Truncate(name string, size int64) error

更改命名文件的大小。如果文件是符号链接,它会更改链接目标的大小。

3.13、其他功能函数

  • UserHomeDir() (string, error):返回当前用户的主目录。例如:C:\Users\用户名
    • 在 Unix 上,包括 macOS ,它返回 $HOME 环境变量。
    • 在 Windows 上,它返回 %USERPROFILE%。
    • 在 Plan9中,它返回 $home 环境变量。
  • TempDir() string:返回用于临时文件的默认目录。例如:C:\Users\用户名\AppData\Local\Temp
    • 既不保证该目录存在,也不保证该目录具有可访问权限
  • UserConfigDir() (string, error):返回用于特定于用户的配置数据的默认根目录。例如:C:\Users\用户名\AppData\Roaming
  • UserCacheDir() (string, error):返回用于特定于用户的缓存数据的默认根目录。例如:C:\Users\用户名\AppData\Local
  • SameFile(fi1, fi2 FileInfo) bool:比较两个文件对象是否相同
  • Chmod(name string, mode FileMode):修改文件权限
  • Link(oldname, newname string) error:创建新名称作为指向旧名称文件的硬链接。
  • Symlink(oldname, newname string) error:创建 newname 作为到 oldname的符号链接。
  • Readlink(name string) (string, error):返回命名符号链接的目标。
  • IsPathSeparator(c uint8) bool:报告c是否为目录分隔符。例如c为 ’ / ’
  • Getwd() (dir string, err error):返回当前项目根路径。例如:D:\goproject\gotest2。
  • Chtimes(name string, atime time.Time, mtime time.Time) error:更改命名文件的访问和修改时间,类似于Unix 的 utime() 或 utimes()函数。

3.14、进程/环境变量相关

  • Exit(code int):Exit会导致当前程序退出,并返回给定的状态代码。代码0表示成功,代码非0表示错误。
  • GetegidGetgroupsGetgidGeteuidGetuid:非windows环境使用
  • FindProcess(pid int) (*Process, error):根据pid获取进程对象
  • StartProcess(name string, argv []string, attr ProcAttr) (Process, error):启动一个新进程,低级接口,os/exec 包提供更高级别的接口。
  • Expand(s string, mapping func(string) string) string:根据映射函数替换字符串中的{var}或var 。例如,os.ExpanEnv(S)。相当于 os.Expand(s,os.Getenv)。
  • ExpandEnv(s string) string:根据当前环境变量的值替换字符串中的 {var} 或 var。对未定义变量的引用将被空字符串替换。
  • GetenvLookupEnvSetenvUnsetenvClearenvEnviron:设置/取消等环境变量的操作。
  • Getpagesize() int :返回底层系统的内存页面大小。本机window测试返回:4096
  • Pipe() (r *File, w *File, err error):返回一对相连的文件;从 r 读取返回写入 w的字节。用于在两个进程之间的管道传递数据。
  • Chown、Lchown:更改指定文件的数字 uid 和 gid。
  • Hostname() (name string, err error):返回内核报告的主机名。例如:DESKTOP-A0ICVRQ
  • Executable() (string, error):返回启动当前进程的可执行文件的路径名。window环境返回空。

三、总结

os包是Go语言标准库中提供的一种操作系统抽象接口,它提供了丰富的函数和方法来访问和操作系统相关的功能。

  • 文件操作:os包提供了许多用于文件操作的函数,如Open、Create、Close、Read、Write等。其中最常用的是Open函数,它可以打开一个文件并返回一个文件句柄,然后可以使用该句柄进行读写操作。

  • 文件路径操作:os包还提供了一些用于处理文件路径的函数,如Abs、Dir、Ext、IsAbs、IsDir、IsFile、Join等。这些函数可以方便地获取文件路径的信息,例如判断一个路径是否是绝对路径或目录等。

  • 进程管理:os包中的Exec函数可以启动一个新的进程,并执行指定的命令。它还提供了一种方式来创建子进程,并在父进程中等待子进程结束。此外,os包还提供了一些用于进程管理的常量和变量,如ModeExecute、ModeCreate等。

  • 环境变量操作:os包中的Getenv和Setenv函数可以获取和设置环境变量的值。使用这两个函数可以轻松地读取和修改系统的环境变量。

  • 错误处理:os包中的Error方法可以获取最后一个错误信息的文本表示形式。在编写程序时,如果需要检查某个操作是否成功,可以使用这个方法来获取错误信息并进行相应的处理。

总之,os包是Go语言中非常重要的一个标准库,它提供了丰富的函数和方法来访问和操作系统相关的功能。掌握这些用法可以帮助我们更加高效地编写程序,并且能够更好地处理与操作系统相关的问题。

免费资源网 - https://freexyz.cn/
返回顶部
顶部