go语言中os包的用法实战大全
作者:才华横溢caozy
前言
Go语言中的os包是操作系统包,提供了丰富的函数和方法用于与操作系统进行交互。本文将介绍一些常用的os包函数和方法,包括文件操作、进程管理、环境变量管理等。
一、文件权限符号
介绍os包之前我们先介绍一下文件权限。
1.1、定义
在 Golang 中,文件权限由三组数字表示,分别表示文件所有者、组成员和其他用户。每组数字由三个数字组成,分别表示读、写和执行权限。数字 0 表示没有权限,数字 4 表示有读权限,数字 2 表示有写权限,数字 1表示有执行权限。
因此,0666 表示所有用户都有读、写权限。
以下是文件权限的完整表格:
权限 | 所有者 | 组成员 | 其他用户 |
---|---|---|---|
读 | 4 | 4 | 4 |
写 | 2 | 2 | 2 |
执行 | 1 | 1 | 1 |
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表示错误。
- Getegid、Getgroups、Getgid、Geteuid、Getuid:非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。对未定义变量的引用将被空字符串替换。
- Getenv、LookupEnv、Setenv、Unsetenv、Clearenv、Environ:设置/取消等环境变量的操作。
- 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语言中非常重要的一个标准库,它提供了丰富的函数和方法来访问和操作系统相关的功能。掌握这些用法可以帮助我们更加高效地编写程序,并且能够更好地处理与操作系统相关的问题。
到此这篇关于go语言中os包用法的文章就介绍到这了,更多相关go语言os包用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!