os标准库

os标准库

os包提供了操作系统函数,但和操作系统无关。

os包的接口规定为在所有操作系统中都是一致的。

设计为Unix风格的。

1. 权限说明

os标准库有大量的文件操作,在创建文件等操作中,需要指的perm。

在go语言中perm是一个uint32类型

在go语言中一般使用0777这样的形式进行表示。

  • 0代表是8进制

  • 777 是 - rwx rwx rwx的形式计算得出

权限项文件类型执行执行执行
字符表示(d|l|c|s|p)rwxrwxrwx
数字表示421421421
权限分配文件所有者文件所有者文件所有者文件所属组用户文件所属组用户文件所属组用户其他用户其他用户其他用户

第一位:

- : 代表这是一个普通文件(regular)
d:目录文件(directory)
l : 链接文件(link)
b: 块设备文件(block)
c: 字符设备文件(character)
s : 套接字文件(socket)
p: 管道文件(pipe)

一共有三组rwx

  • 第一组:该文件拥有者的权限
  • 第二组:该文件拥有者所在组的其他成员对该文件的操作权限
  • 第三组:其他用户组的成员对该文件的操作权限

计算过程如下:

rwxrwxrwx
111111111
777

go中的FileMode定义

type FileMode uint32

FileMode代表文件的模式和权限位。这些字位在所有的操作系统都有相同的含义,因此文件的信息可以在不同的操作系统之间安全的移植。不是所有的位都能用于所有的系统,唯一共有的是用于表示目录的ModeDir位。

const (// 单字符是被String方法用于格式化的属性缩写。ModeDir        FileMode = 1 << (32 - 1 - iota) // d: 目录ModeAppend                                     // a: 只能写入,且只能写入到末尾ModeExclusive                                  // l: 用于执行ModeTemporary                                  // T: 临时文件(非备份文件)ModeSymlink                                    // L: 符号链接(不是快捷方式文件)ModeDevice                                     // D: 设备ModeNamedPipe                                  // p: 命名管道(FIFO)ModeSocket                                     // S: Unix域socketModeSetuid                                     // u: 表示文件具有其创建者用户id权限ModeSetgid                                     // g: 表示文件具有其创建者组id的权限ModeCharDevice                                 // c: 字符设备,需已设置ModeDeviceModeSticky                                     // t: 只有root/创建者能删除/移动文件// 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDeviceModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位)
)

这些被定义的位是FileMode最重要的位。另外9个不重要的位为标准Unix rwxrwxrwx权限(任何人都可读、写、运行)。这些(重要)位的值应被视为公共API的一部分,可能会用于线路协议或硬盘标识:它们不能被修改,但可以添加新的位。

2. os.Create

func Create(name string) (file *File, err error)

Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。

如果出错,错误底层类型是*PathError

// 创建文件
func createFile() {f, err := os.Create("test.txt")if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Printf("f: %v\n", f)}
}

3. os.Mkdir

创建单个目录

func Mkdir(name string, perm FileMode) error {}
func mkdir() {err := os.Mkdir("ms", os.ModePerm)if err != nil {fmt.Printf("err: %v\n", err)} 
}

4. os.MkdirAll

创建多级目录

func MkdirAll(path string, perm FileMode) error {}
func mkdirAll() {err := os.MkdirAll("ms/one/two", os.ModePerm)if err != nil {fmt.Printf("err: %v\n", err)}
}

5. os.Remove

删除一个空的目录或一个文件

func Remove(name string) error {}
func removeFile() {err := os.Remove("test.txt")if err != nil {fmt.Printf("err: %v\n", err)}
}
func removeDir() {err := os.Remove("ms/one/two")if err != nil {fmt.Printf("err: %v\n", err)}
}

6. os.RemoveAll

强制删除目录以及目录汇中的文件

func RemoveAll(path string) error {return removeAll(path)
}
func removeAllDir() {err := os.RemoveAll("ms")if err != nil {fmt.Printf("err: %v\n", err)}
}

7. os.Getwd

获得工作目录

func Getwd() (dir string, err error) {}
func getWd() {dir, err := os.Getwd()if err != nil {fmt.Printf("err: %v\n", err)} else {fmt.Printf("dir: %v\n", dir)}
}

8. os.Chdir

修改工作目录

//改变工作目录到f,其中f必须为一个目录,否则便会报错
func (f *File) Chdir() error
func chDir() {err := os.Chdir("d:/go/project")if err != nil {fmt.Printf("err: %v\n", err)}fmt.Println(os.Getwd())
}

9. os.TempDir

获得临时目录

func TempDir() string {return tempDir()
}
func tempDir() {s := os.TempDir()fmt.Printf("s: %v\n", s)
}

10. os.Rename

重命名文件

func Rename(oldpath, newpath string) error {return rename(oldpath, newpath)
}
func renameFile() {err := os.Rename("test.txt", "test2.txt")if err != nil {fmt.Printf("err: %v\n", err)}
}
func renameDir() {err := os.Rename("ms", "ms1")if err != nil {fmt.Printf("err: %v\n", err)}
}

11. os.Chmod

修改文件权限

func Chmod(name string, mode FileMode) error { return chmod(name, mode) 
}
func chmod() {err := os.Chmod("test2.txt", 0111)if err != nil {fmt.Printf("err: %v\n", err)}
}

打包linux测试

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

12. os.Chown

修改文件所有者

func Chown(name string, uid, gid int) error {}

cat /etc/passwd 查看uid和gid

func chown() {err := os.Chown("test2.txt", 10, 10)if err != nil {fmt.Printf("err: %v\n", err)}
}

13. 文件

打开模式

const (O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/OO_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)
 // 创建一个空文件,注意当文件已经存在时,会直接覆盖掉原文件,不会报错
func Create(name string) (file *File, err error)
// 打开一个文件,注意打开的文件只能读,不能写
func Open(name string) (file *File, err error) 
// 以指定的权限打开文件
func OpenFile(name string, flag int, perm FileMode) (file *File, err error) 
// 关闭文件,关闭后不可读写
func (f *File) Close() error 

其实os.Create 等价于:OpenFile(name, O_RDWF|O_CREATE|O_TRUNK, 0666)

func openClose() {f, err := os.OpenFile("test2.txt", os.O_RDWR|os.O_CREATE, 0755)if err != nil {panic(err)}fmt.Println("file name : ", f.Name())defer f.Close()}

13.1 文件读取

// 获取文件的信息,里面有文件的名称,大小,修改时间等
func (f *File) Stat() (fi FileInfo, err error) 
// 从文件中一次性读取b大小的数据,当读到文件结尾时,返回一个EOF错误
func (f *File) Read(b []byte) (n int, err error) 
// 从文件中指定的位置(off)一次性读取b大小的数据
func (f *File) ReadAt(b []byte, off int64) (n int, err error) 
// 读取目录并返回排好序的文件以及子目录名切片
func ReadDir(name string) ([]DirEntry, error) 
//Seek设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
type FileInfo interface {Name() string       // 文件的名字(不含扩展名)Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同Mode() FileMode     // 文件的模式位ModTime() time.Time // 文件的修改时间IsDir() bool        // 等价于Mode().IsDir()Sys() interface{}   // 底层数据来源(可以返回nil)
}func fileStat() {f, err := os.OpenFile("test2.txt", os.O_RDWR|os.O_CREATE, 0755)if err != nil {panic(err)}defer f.Close()fileInfo, err := f.Stat()if err != nil {panic(err)}fmt.Printf("file info : %#v", fileInfo)
}

func fileRead() {f, err := os.OpenFile("test2.txt", os.O_RDWR|os.O_CREATE, 0755)if err != nil {panic(err)}defer f.Close()var body []bytefor {buf := make([]byte, 4)n, err := f.Read(buf)if err == io.EOF {//读完了break}fmt.Printf("读到的位置:%d \n", n)body = append(body, buf[:n]...)}fmt.Printf("内容:%s \n", body)
}

func fileReadAt() {f, err := os.OpenFile("test2.txt", os.O_RDWR|os.O_CREATE, 0755)if err != nil {panic(err)}defer f.Close()buf := make([]byte, 5)n, err := f.ReadAt(buf, 6)fmt.Printf("内容:%s \n", buf[:n])
}

func fileReadDir() {f, err := os.Open("ms1")if err != nil {panic(err)}defer f.Close()//-1代表所有dirs, err := f.ReadDir(-1)if err != nil {panic(err)}for _, v := range dirs {fmt.Println("is dir:", v.IsDir())fmt.Println("dir name :", v.Name())}
}

func fileSeek() {f, err := os.OpenFile("test2.txt", os.O_RDWR|os.O_CREATE, 0755)if err != nil {panic(err)}defer f.Close()f.Seek(3, 0)buf := make([]byte, 10)n, _ := f.Read(buf)fmt.Printf("读取内容:%s\n", buf[:n])
}

13.2 文件写

//Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
func (f *File) Write(b []byte) (n int, err error)
//WriteString类似Write,但接受一个字符串参数。
func (f *File) WriteString(s string) (ret int, err error)
//WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
func fileWrite() {f, err := os.OpenFile("test2.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)if err != nil {panic(err)}defer f.Close()f.Write([]byte("hello golang~\n"))f.WriteString("hello golang~\n")
}
func fileWriteAt() {f, err := os.OpenFile("test2.txt", os.O_RDWR|os.O_CREATE, 0755)if err != nil {panic(err)}defer f.Close()_, err = f.WriteAt([]byte(" insert content~\n"), 5)fmt.Println(err)
}

14. 进程相关

// 让当前程序以给出的状态码(code)退出。一般来说,状态码0表示成功,非0表示出错。程序会立刻终止,defer的函数不会被执行。
func Exit(code int) 
// 获取调用者的用户id
func Getuid() int 
// 获取调用者的有效用户id
func Geteuid() int // 获取调用者的组id
func Getgid() int
// 获取调用者的有效组id
func Getegid() int 
// 获取调用者所在的所有组的组id
func Getgroups() ([]int, error) 
// 获取调用者所在进程的进程id
func Getpid() int 
// 获取调用者所在进程的父进程的进程id
func Getppid() int 

func osInfo() {// 获得当前正在运行的进程idfmt.Println("---------")fmt.Printf("os.Getpid(): %v\n", os.Getpid())// 父idfmt.Printf("os.Getppid(): %v\n", os.Getppid())// 设置新进程的属性attr := &os.ProcAttr{// files指定新进程继承的活动文件对象// 前三个分别为,标准输入、标准输出、标准错误输出Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},// 新进程的环境变量Env: os.Environ(),}// 开始一个新进程p, err := os.StartProcess("c:\\windows\\system32\\notepad.exe", []string{"c:\\windows\\system32\\notepad.exe", "d:\\test.txt"}, attr)if err != nil {fmt.Println(err)}fmt.Println(p)fmt.Println("进程ID:", p.Pid)// 通过进程ID查找进程p2, _ := os.FindProcess(p.Pid)fmt.Println(p2)// 等待10秒,执行函数time.AfterFunc(time.Second*10, func() {// 向p进程发出退出信号p.Signal(os.Kill)})// 等待进程p的退出,返回进程状态ps, _ := p.Wait()fmt.Println(ps.String())
}

type Signal

type Signal interface {String() stringSignal() // 用来区分其他实现了Stringer接口的类型
}

Signal代表一个操作系统信号。一般其底层实现是依赖于操作系统的:在Unix中,它是syscall.Signal类型。

var (Interrupt Signal = syscall.SIGINTKill      Signal = syscall.SIGKILL
)

仅有的肯定会被所有操作系统提供的信号,Interrupt(中断信号)和Kill(强制退出信号)。

var (ErrInvalid    = errors.New("invalid argument")ErrPermission = errors.New("permission denied")ErrExist      = errors.New("file already exists")ErrNotExist   = errors.New("file does not exist")
)

一些可移植的、共有的系统调用错误。

var (Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

Stdin、Stdout和Stderr是指向标准输入、标准输出、标准错误输出的文件描述符。

var Args []string

Args保管了命令行参数,第一个是程序名。

14.1 Signal


func main() {go a()go b()ch := make(chan os.Signal)signal.Notify(ch, os.Kill, os.Interrupt)c := <-chlog.Println(c)
}func b() {fmt.Println("b")
}func a() {fmt.Println("a")
}

15. 环境相关

// 获取主机名
func Hostname() (name string, err error) 
// 获取某个环境变量
func Getenv(key string) string  
// 设置一个环境变量,失败返回错误,经测试当前设置的环境变量只在 当前进程有效(当前进程衍生的所有的go程都可以拿到,子go程与父go程的环境变量可以互相获取);进程退出消失
func Setenv(key, value string) error 
// 删除当前程序已有的所有环境变量。不会影响当前电脑系统的环境变量,这些环境变量都是对当前go程序而言的
func Clearenv() 

func osEnv() {// 获得所有环境变量s := os.Environ()fmt.Printf("s: %v\n", s)// 获得某个环境变量s2 := os.Getenv("GOPATH")fmt.Printf("s2: %v\n", s2)// 设置环境变量os.Setenv("env1", "env1")s2 = os.Getenv("aaa")fmt.Printf("s2: %v\n", s2)fmt.Println("--------------")// 查找s3, b := os.LookupEnv("env1")fmt.Printf("b: %v\n", b)fmt.Printf("s3: %v\n", s3)// 清空环境变量// os.Clearenv()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92545.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QtC++ 中使用 qtwebsocket 开源库实现基于websocket的本地服务开发详解

前言 当前实时通信功能越来越受到重视&#xff0c;无论是在线聊天、实时数据监控还是多人协作工具&#xff0c;都离不开高效、稳定的实时通信技术。WebSocket 作为一种全双工通信协议&#xff0c;为实时通信提供了良好的解决方案。而在 QtC 开发环境中&#xff0c;qtwebsocket …

小程序实时保存优化

背景。避免数据存储后丢失。要求实时保存。问题&#xff1a;保存时出现卡断&#xff0c;输入的内容会被抹除。问题原因。输入频繁速度块&#xff0c;会影响cpu处理速度。解决方案。用户停止输入500ms后开始保存&#xff0c;否则不保存。这里是保存方法&#xff1a;当500ms以内有…

国产化Excel处理组件Spire.XLS教程:使用 C# 将 DataTable 导出为 Excel 文件

在 C# 中将 DataTable 导出为 Excel 文件&#xff0c;是 .NET 开发中常见的任务&#xff0c;广泛应用于报表生成、日志导出、系统间数据共享等场景。通过使用独立的组件库&#xff0c;开发者可以轻松将 DataTable 数据写入 Excel 文件&#xff0c;并应用格式设置&#xff0c;生…

C语言学习笔记——编译和链接

目录1 C程序的执行流程2 翻译环境2.1 预编译2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语法分析2.3 汇编2.4 链接1 C程序的执行流程 用户编写好的C程序不能直接被计算机识别并执行&#xff0c;在执行前&#xff0c;要先将源文件和头文件进行编译&#xff0c;生成目标文件&am…

Flink-1.19.0源码详解9-ExecutionGraph生成-后篇

《Flink-1.19.0源码详解8-ExecutionGraph生成-前篇》前篇已从Flink集群端调度开始解析ExecutionGraph生成的源码&#xff0c;解析了ExecutionGraph的ExecutionJobVertex节点、ExecutionVertex节点、IntermediateResult数据集、IntermediateResultPartition数据集分区与封装Task…

19、阈值分割+blob分析

目录 一、仿射变换 1.变换矩阵 2.在矩阵的基础上添加各种变换形式 3.开始变换 4.计算变换矩阵参数 新算子 二、阈值分割 新算子 三、blob分析案例 1.焊点 2.石头 3.木材 4.车牌 5.骰子 新算子 一、仿射变换 1.变换矩阵 // 产生仿射变换矩阵hom_mat2d_identity…

破解 Django N+1 查询困境:使用 select_related 与 prefetch_related 实践指南

破解 Django N+1 查询困境:使用 select_related 与 prefetch_related 实践指南 开篇引入 数据库查询性能常常是 Web 应用性能瓶颈中的重中之重。Django ORM 以简洁直观的 API 层将 Python 代码与数据库打通,却也可能因默认的惰性加载带来 N+1 查询问题,造成不必要的网络往…

深入解析K-means聚类:从原理到调优实战

一、聚类分析与K-means的核心价值在无监督学习领域&#xff0c;聚类分析是探索数据内在结构的核心技术。​K-means算法因其简洁高效成为最广泛使用的聚类方法&#xff0c;在客户分群、图像压缩、生物信息学等领域应用广泛。其核心目标是将数据集划分为K个簇&#xff0c;实现“簇…

数据结构基础:哈希表、排序和查找算法

目录 一、哈希表 1.哈希算法 2.哈希碰撞 3.哈希表 4.哈希表相关操作 哈希表插入 哈希表遍历 元素查找 哈希表销毁 二、排序算法 1. 排序算法对比 2. 排序算法实现 冒泡排序 选择排序 插入排序 希尔排序 快速排序 三、查找算法 1. 查找算法对比 2. 查找算法实…

Linux内核参数调优:为K8s节点优化网络性能

在高并发微服务环境中&#xff0c;网络性能往往成为K8s集群的瓶颈。本文将深入探讨如何通过精细化的Linux内核参数调优&#xff0c;让你的K8s节点网络性能提升30%以上。引言&#xff1a;为什么网络调优如此重要&#xff1f;作为一名在生产环境中维护过数千节点K8s集群的运维工程…

全家桶” 战略如何重塑智能服务标准?无忧秘书 AI + 智脑 + 数字人协同模式的底层架构解析

在数字化浪潮的推动下&#xff0c;企业对智能化服务的需求日益增长。然而&#xff0c;单一的技术或产品往往难以满足复杂场景下的多样化需求。近年来&#xff0c;“全家桶”战略成为科技行业的一大趋势&#xff0c;通过整合多维度技术与服务&#xff0c;为企业提供全方位的支持…

前端后端之争?JavaScript和Java的特性与应用场景解析

一、名字相似&#xff0c;本质迥异 1.1 历史渊源与命名背景 在编程世界中&#xff0c;很少有两种语言像JavaScript和Java这样&#xff0c;仅仅因为名字的相似性就引发了无数初学者的困惑。然而&#xff0c;这种相似性纯属巧合——或者说是一种营销策略的产物。 JavaScript诞…

【文献分享】Machine learning models提供数据和代码

数据输入及前期信息&#xff1a;ChronoGauge 需要一个基因表达矩阵&#xff0c;其中包括来自多个时间进程 RNA-测序实验的观测数据&#xff0c;用于训练&#xff0c;并且需要有关每个基因在连续光照&#xff08;LL&#xff09;条件下经过光暗&#xff08;LD&#xff09;周期调整…

PHP MySQL Delete 操作详解

PHP MySQL Delete 操作详解 引言 在Web开发中&#xff0c;数据库是存储和管理数据的重要工具。PHP作为一种流行的服务器端脚本语言&#xff0c;与MySQL数据库结合使用可以高效地处理数据。本文将详细介绍PHP中如何使用DELETE语句删除MySQL数据库中的数据。 什么是DELETE语句&am…

计组-大/小端存放区别

在计算机系统中&#xff0c;大端存放&#xff08;Big-Endian&#xff09;和小端存放&#xff08;Little-Endian&#xff09;是两种不同的多字节数据存储方式&#xff0c;主要区别在于字节在内存中的排列顺序。理解它们对底层编程&#xff08;如网络通信、二进制文件处理、硬件交…

线程同步相关知识

文章目录一、线程同步的核心目标二、线程安全的判定条件三、同步方式一&#xff1a;synchronized 关键字1. 同步代码块2. 同步方法四、锁的释放与不释放场景1. 自动释放锁的场景2. 不会释放锁的场景五、同步方式二&#xff1a;ReentrantLock&#xff08;显式锁&#xff09;1. 核…

Armoury Crate无法通过BIOS卸载

设备&#xff1a;天选4 Armoury Crate窗口反复弹出影响使用体验&#xff0c;但无法通过BIOS关闭该怎么办&#xff1f;本文以天选4为例提供解决方案。 Step1&#xff1a;进入服务支持官网 Armoury Crate-服务支持 下滑点击”查看更多” 下载安装卸载工具 得到Armoury_Crate_Un…

如何将视频转为GIF格式,3大视频转为GIF工具

在社交媒体和即时通讯盛行的当下&#xff0c;GIF 动图以其独特的魅力备受青睐。它能够生动地捕捉视频中的精彩瞬间&#xff0c;凭借体积小巧、无需复杂加载且可循环播放的特性&#xff0c;成为了人们在网络交流中表达情感、分享趣事的得力工具。无论是制作诙谐幽默的表情包&…

开发避坑指南(22):Vue3响应式编程中this绑定机制与解决方案

错误信息 TypeError: Cannot read properties of undefined (reading find) TypeError: r.vnode.el.querySelector is not a function报错背景 vue2项目升级到vue3后&#xff0c;原来的代码报错。 报错代码computed: {/** 计算列的显示与隐藏*/columnVisible() {return functio…

AI学习笔记三十五:实时传输视频

若该文为原创文章&#xff0c;转载请注明原文出处。 目的是实现视频的传输&#xff0c;只是个demo. 程序分为两部分&#xff0c;视频接收端和视频发送端。 一、视频接收端流程分析 主要流程&#xff1a; 初始化配置&#xff1a; 设置UDP端口&#xff08;5001&#xff09;和缓…