os 包提供了对文件、系统和进程的操作函数
a) 文件操作
常用常量:
⚫ Stdin
⚫ Stdout
⚫ Stderr
⚫ ModePerm:0777
常用函数:
⚫ Chmod:修改文件权限
⚫ Chown:修改文件所属用户,用户组
⚫ Chtimes:修改文件访问时间和修改时间
⚫ IsExist:与 os.Stat 一起用于判断文件存在
⚫ IsNotExist:与 os.Stat 一起用于判断文件不存在
⚫ Link:创建软链接
⚫ Mkdir创建文件夹手撕 Go 语言
⚫ MkdirAll:创建文件夹(父目录不存在逐层创建)
⚫ Remove:移除文件或空文件夹
⚫ RemoveAll:移除所有文件
⚫ Rename:重命名
常用结构体:
⚫ File:对文件操作
常用函数:
➢ Create:创建文件并返回文件对象指针(文件不存在则创建,文件存在则清空)
➢ Open:打开文件并返回文件对象指针
➢ OpenFile:按指定权限打开文件,并返回文件指针对象
常用方法:
➢ Read:读取文件到字节切片
➢ Write:写入字节切片到文件
➢ WriteString:写入字符串到文件
➢ Readdir:获取目录下所有文件信息
➢ Readdirnames:获取目录下所有文件名
➢ Seek:设置文件指针位置
➢ Stat:获取文件状态信息
➢ Sync:同步文件到硬盘
➢ Close:关闭文件
⚫ FileInfo:文件状态信息
常用函数:
➢ Lstat:获取文件路径文件信息(对于链接返回连接文件信息)
➢ Stat:获取文件路径文件信息(对于链接返回连接到的文件的信息)
常用方法:
➢ Name:获取文件名
➢ Size:获取文件大小
➢ Mode:获取文件模式
➢ ModTime:获取修改时间
➢ IsDir:判断是否为文件夹
⚫ FileMode:文件模式
常用方法:
➢ IsDir:判断是否为文件夹
b) 系统操作
常用函数:
⚫ Environ:获取环境变量切片
⚫ Setenv:设置环境变量手撕 Go 语言
⚫ Getenv:获取环境变量
⚫ LookupEnv: 获取环境变量
⚫ Unsetenv:清除环境变量
⚫ Clearenv:清空环境变量
⚫ Executable:获取当前执行文件路径
⚫ Hostname:获取主机名
⚫ TempDir:获取临时目录
⚫ UserHomeDir:获取用户 home 目录
⚫ UserCacheDir:获取用户缓存目录
c) 进程操作
常用常量:
⚫ Args:获取命令行参数
常用函数:
⚫ Getuid:获取进程所属用户 ID
⚫ Getgid:获取进程所属用户组 ID
⚫ Getpid:获取当前进程 id
⚫ Getppid:获取父进程 id
⚫ Getwd:获取工作目录
⚫ Chdir:修改当前工作目录
⚫ Exit:退出程序
常用结构体:
⚫ Process
常用方法
➢ FindProcess:根据进程 id 查找进程对象指针
➢ StartProcess:启动进程
➢ Kill:杀死进程
➢ Release:释放进程资源信息
➢ Signal:发送信息给进程
➢ Wait:等待进程退出,并返回进程状态信息指针
⚫ ProcessState
常用方法:
➢ ExitCode:退出状态码
➢ Exited:是否已经退出
➢ Pid:进程 id
➢ Success:是否成功退出
➢ SystemTime:内核态执行时间
➢ UserTime:用户态时间时间
1.读取&创建
package main
import (
"fmt"
"io"
"os"
)
func main() {
path := "user.txt"
path2 := "user2.txt"
//创建文件
file2,_ := os.Create(path2)
file , err := os.Open(path)
if err != nil {
fmt.Println(err)
}else {
bytes := make([]byte, 20)
for {
//这里n是传回来的长度 比如切片是20字节 但是文件只有10字节 n就是读取回来文件内容长度
n, err := file.Read(bytes)
if err != nil {
//io.EOF 是当文件读取到末尾会有一个返回值err 为io.EOF 表示文件读取完毕
if err != io.EOF {
fmt.Println(err)
}
break
} else if err == nil {
//把user.txt 读并且写入user2.txt
file2.Write(bytes[:n])
fmt.Print(string(bytes[:n]))
}
}
}
file.Close()
}
2.写入
package main
import (
"fmt"
"os"
)
//每次创建文件写入 都是删除重新写入
func main() {
path := "user2.txt"
file,err := os.Create(path)
if err != nil {
fmt.Println(err)
}else if err == nil {
file.Write([]byte("bbbbb"))
file.WriteString("ccccccc")
}
file.Close()
}
3.删除&重命名
(1)删除
package main
import "os"
func main() {
//创建目录
//这里有个返回值 如果文件夹存在 会返回一个报错
os.Mkdir("test01",0644)
//重命名
os.Rename("test01","test02")
//删除
os.Remove("test02")
//如果目录有子目录 创建
os.MkdirAll("test/a",0644)
//如果目录有子目录remove 会无法删除 需要用removeall
os.RemoveAll("test")
}
(2)重命名
package main
import "os"
func main() {
//重命名
os.Rename("bbb.txt","user.txt")
//删除
os.Remove("user.txt")
}
4.文件指针
package main
import (
"fmt"
"os"
)
func main() {
file,_ := os.Open("user3.txt")
//偏移量,相对位置
//文件开始 0 os.SEEK_SET
//当前位置 1 os.SEET_CUR
//文件末尾 2 os.SEET_END
//偏移量正数向后偏移多少字节,负数向前偏移多少字节
//一般用于打开文件的时候直接跳至末尾开始追加
fmt.Println(file.Seek(-1,2))
bytes := make([]byte,100)
n ,err := file.Read(bytes)
fmt.Println(n,err,string(bytes[:n]))
n,err = file.Read(bytes)
fmt.Println(n,err,bytes[:n])
file.Close()
}
5.追加
package main
import (
"os"
"strconv"
"time"
)
func main() {
path := "user3.txt"
//os.ModePerm 子网掩码 默认0777
//os.O_APPEND 追加
//os.O_CREATE 创建
//这里的意思使如果没有就创建 如果有就追加 OpenFile这里有很多常量 常用的就这两个
file,err := os.OpenFile(path,os.O_APPEND|os.O_CREATE,os.ModePerm)
if err == nil {
//这里formatint 也可以用fmt.Sprintf
file.WriteString(strconv.FormatInt(time.Now().Unix(),10))
file.WriteString("\n")
file.Close()
}
}
6.获取文件信息
package main
import (
"fmt"
"os"
)
func main() {
//判断文件是否存在
file ,err := os.Open("xxx")
if err != nil {
if os.IsNotExist(err){
fmt.Println("文件不存在")
}
}else {
file.Close()
}
for _,path := range []string{"xxxx","logs.go","dir.go"} {
fileinfo,err := os.Stat(path)
if err != nil {
if os.IsNotExist(err){
fmt.Println("文件不存在")
}
}else {
//获取文件名
fmt.Println(fileinfo.Name())
//判断是否是目录 是目录返回true 不是则返回false
fmt.Println(fileinfo.IsDir())
//获取权限rwx
fmt.Println(fileinfo.Mode())
//获取最后修改时间
fmt.Println(fileinfo.ModTime())
//获取文件大小 单位字节
fmt.Println(fileinfo.Size())
fmt.Println(fileinfo.Sys())
}
}
}