Go语言学习笔记—golang标准库os包
创始人
2024-03-29 16:44:30
0

一 权限

权限perm,在创建文件时才需要指定,不需要创建新文件时可以将其设定为0。虽然go语言给perm权限设定了很多的常量,但是习惯上也可以直接使用数字,如0666(具体含义和Unix系统的一致)。

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

关于- rwx rwx rwx:
-:代表这是一个普通文件,其中其他文件类型还包括了:
d--------------------->目录文件(directory)
l---------------------->链接恩建(link)
b--------------------->设备文件(block)
c---------------------->字符设备文件(character)
s---------------------->套接字文件(socket)
p---------------------->管道文件(pipe)

二目录相关

2.1 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)}
}

2.2 创建目录

2.2.1 os.Mkdir 函数创建单个目录
func Mkdir(name string,perm FileMode) error{}

只能创建单个目录,不能创建多级目录

实例演示:

func createDir1() {err := os.Mkdir("test", os.ModePerm)if err != nil {fmt.Printf("err: %v\n", err)} 
}
2.2.2 os.MkdirAll 函数创建多级目录
func MkdirAll(path string ,perm FileMode) error{}

实例演示:

func createDir2() {err := os.MkdirAll("test/a/b", os.ModePerm)if err != nil {fmt.Printf("err: %v\n", err)}
}

2.3 删除目录

2.3.1 os.Remove 函数只能删除一个空的目录活一个文件
func Remove(name string) error{}

实例演示:

func removeDir1() {err := os.Remove("test.txt")if err != nil {fmt.Printf("err: %v\n", err)}
}
os.RemoveAll函数可以强制删除目录以及目录汇中的文件
func RemoveAll(path string) error{retuen removeAll(path)
}

实例演示:

func removeDir2() {err := os.RemoveAll("test")if err != nil {fmt.Printf("err: %v\n", err)}
}

2.4 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)}
}

2.5 os.Chdir函数修改工作目录

func (f *File) Chdir() error

改变工作目录到f,其中f必须为一个目录,否则便会报错

实例演示:

func chWd() {err := os.Chdir("d:/")if err != nil {fmt.Printf("err: %v\n", err)}fmt.Println(os.Getwd())
}

2.6 os.TempDir获得临时目录

func TempDir() string{return tempDir
}

实例演示:

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

2.7 os.Rename重命名文件

func Rename(olapath , 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)}
}

2.8 os.Chmod函数修改文件权限

func Chmod(name string,mode FileMode) error {return chmod(name,mode)
}

2.9 os.Chown函数修改文件所有者

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

三 文件打开与关闭

3.1文件打开模式

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  // 如果可能,打开时清空文件
)

3.2 文件打开与关闭操作

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_RDWR|O_CREATE|O_TRUNC, 0666)

实例演示:

package mainimport ("fmt""os"
)func openCloseFile() {// 只能读f, _ := os.Open("a.txt")fmt.Printf("f.Name(): %v\n", f.Name())// 根据第二个文件打开模式参数 可以指定权限为读写或者创建f2, _ := os.OpenFile("a1.txt", os.O_RDWR|os.O_CREATE, 0755)fmt.Printf("f2.Name(): %v\n", f2.Name())err := f.Close()fmt.Printf("err: %v\n", err)err2 := f2.Close()fmt.Printf("err2: %v\n", err2)
}func main() {openCloseFile()
}

File文件读操作

func (f *File) Stat() (fi FileInfo,err error) //获取文件的信息,里面有文件的名称,大小,修改时间等func (f *File) Read(b []byte) (n int,err error) //从文件中一次性读取b大小的数据,当读到文件结尾时,返回EOF错误 func (f *File) ReadAt(b []byte,off int64) (n int, err error)//从文件中指定的位置(off)一次性读取b大小的数据func ReadDir(name string) ([]DirEntry,error) //读取目录并返回排序好的文件以及子目录名切片func (f *File) Seek(offset int64,whence int) (ret int64,err error)
//Seek设置下次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
4.1 f.Read()
package mainimport ("fmt""io""os"
)func main() {f, _ := os.Open("a.txt")for {buf := make([]byte, 4) // 设置一个缓冲区,一次读4个字节n, err := f.Read(buf)  // 将读到的内容放入缓冲区内fmt.Printf("string(buf): %v\n", string(buf))fmt.Printf("n: %v\n", n)if err == io.EOF { // EOF表示文件读取完毕break}}f.Close()
}
4.1 f.ReadAt()
package mainimport ("fmt""os"
)func main() {buf := make([]byte, 10)f2, _ := os.Open("a.txt")// 从5开始读10个字节n, _ := f2.ReadAt(buf, 5)fmt.Printf("n: %v\n", n)fmt.Printf("string(buf): %v\n", string(buf))f2.Close()
}
4.3 f.ReadDir
package mainimport ("fmt""os"
)func main() {// 测试 a目录下有b和c目录f, _ := os.Open("a")de, _ := f.ReadDir(-1) // 返回一个切片defor _, v := range de {fmt.Printf("v.IsDir(): %v\n", v.IsDir())fmt.Printf("v.Name(): %v\n", v.Name())}
}
4.4 f.Seek()
package mainimport ("fmt""os"
)func main() {f, _ := os.Open("a.txt") // 打开文件后,光标默认在文件开头f.Seek(3, 0) // 从索引值为3处开始读buf := make([]byte, 10) // 设置缓冲区n, _ := f.Read(buf) // 将内容读到缓冲区内fmt.Printf("n: %v\n", n)fmt.Printf("string(buf): %v\n", string(buf))f.Close()
}
4.5 f.Stat()
package mainimport ("fmt""os"
)func main() {f, _ := os.Open("a.txt") // 打开文件后,光标默认在文件开头fInfo, _ := f.Stat()fmt.Printf("f是否是一个文件: %v\n", fInfo.IsDir())fmt.Printf("f文件的修改时间: %v\n", fInfo.ModTime().String())fmt.Printf("f文件的名称: %v\n", fInfo.Name())fmt.Printf("f文件的大小: %v\n", fInfo.Size())fmt.Printf("f文件的权限: %v\n", fInfo.Mode().String())
}

五 File文件写操作

func (f *File) Write(b []byte) (n int, err error)
//Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。func (f *File) WriteString(s string) (ret int,err error)
//WriteString类似Write,但接受一个字符串参数func (f *File) WriteAt(b []byte,off int64) (n int , err error)
// WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法返回一个非nil的错误。
5.1 f.Write()
package mainimport ("os"
)func main() {f, _ := os.OpenFile("a.txt", os.O_RDWR|os.O_APPEND, 0775) // 以读写模式打开文件,并且在写操作时将数据附加到文件尾部f.Write([]byte(" hello golang"))f.Close()
}
5.3 f.WriteAt()
package mainimport ("os"
)func main() {f, _ := os.OpenFile("a.txt", os.O_RDWR, 0775) // 以读写模式打开文件f.WriteAt([]byte("aaa"), 3) // 从索引值为3的地方开始写入aaa并覆盖原来当前位置的数据f.Close()
}

六 进程相关操作(了解)

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

七 环境相关操作(了解)

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

相关内容

热门资讯

网络技术展开型介绍(超详细) ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,疫情之下&#x...
Git__本地分支与远程分支的... 文章目录前言1. 用git checkout命令关联2.用 git push命令关联3.用 git ...
LocalDateTime 的... 与 Date 相比 LocalDateTime 线程安全,因为所有字段都用了 fina...
C++ Primer笔记——l... 目录 一.lambda介绍 (一).总体介绍 (二...
Mac上安装和测试Kafka 1. 安装 默认会把zookeeper一起安装好 brew install kafka 安装日志&#...
@计算矩阵的特征值与特征向量 @计算矩阵的特征值与特征向量 文章目录 我们经常遇到一个问题就是如何计算一个矩阵的特征值和特征向...
Shell脚本编写 1 入门 1.1 脚本格式 脚本以#!/bin/bash开头(指定bash解析器&#x...
C/C++KTV点歌系统 C/C++KTV点歌系统 KTV点歌系统(版本1) 1 ...
重学c/c++之预处理 预定义符号 这些定义符号都是语言内置的 printf("%s\n",__FILE__);//绝对路...
C/C++数据结构课程设计[长... C/C++数据结构课程设计[长春理工大学计算机科学技术学院2022秋季学期] 长春理...