介绍os包之前我们先介绍一下文件权限。
在 Golang 中,文件权限由三组数字表示,分别表示文件所有者、组成员和其他用户。每组数字由三个数字组成,分别表示读、写和执行权限。数字 0 表示没有权限,数字 4 表示有读权限,数字 2 表示有写权限,数字 1表示有执行权限。
因此,0666 表示所有用户都有读、写权限。
以下是文件权限的完整表格:
权限 | 所有者 | 组成员 | 其他用户 |
---|---|---|---|
读 | 4 | 4 | 4 |
写 | 2 | 2 | 2 |
执行 | 1 | 1 | 1 |
POSIX(Portable Operating System Interface for Unix)是一种定义了操作系统交互接口的标准,旨在确保在不同操作系统上的程序具有一致的行为。在POSIX标准中,文件权限通常以八进制数字表示,并且在数字前面加上一个"0"。
因此,为了遵循POSIX标准并与其他系统兼容,Go语言中的os.Stat函数将文件权限设置为0666而不是直接使用666。这样可以确保在不同的操作系统上都能正确地解析和处理文件权限。
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)
}
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())
}
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}
Create
Create(name string) (*File, error) // 创建文件,文件存在则覆盖,底层调用的是OpenFile
返回*File指针对象和error,使用File对象,可以对文件进行读写操作。
CreateTemp
CreateTemp(dir, pattern string) (*File, error)
Open(name string) (*File, error) //以只读方式打开文件
OpenFile(name string, flag int, perm FileMode) (*File, error) // 打开或创建文件
Open方法
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 存在则覆盖 打开时截断常规可写文件。
打开一个文件,如果文件不存在则创建,默认不会覆盖
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)
WriteFile(name string, data []byte, perm FileMode) error
//写文件,底层调用OPenFile,以只写方式打开文件,如果文件存在,则覆盖,不存在则创建
ReadFile(name string) ([]byte, error)
Rename(oldpath, newpath string) error
Remove(name string) error // 删除文件
RemoveAll(path string) error //删除目录
// 删除路径及其包含的所有子路径。它会删除它能删除的所有内容,不存在不会报错
不存在会报错
Mkdir
Mkdir(name string, perm FileMode) error
MkdirAll
MkdirAll(path string, perm FileMode) error
创建临时目录-MkdirTemp
MkdirTemp(dir, pattern string) (string, error)
Chmod(name string, mode FileMode) error
DirFS(dir string) fs.FS
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())
}
}
Truncate(name string, size int64) error
更改命名文件的大小。如果文件是符号链接,它会更改链接目标的大小。
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语言中非常重要的一个标准库,它提供了丰富的函数和方法来访问和操作系统相关的功能。掌握这些用法可以帮助我们更加高效地编写程序,并且能够更好地处理与操作系统相关的问题。