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程序而言的

相关内容

热门资讯

华侨银行:下半年市场或继续向好... 转自:新华财经新华财经新加坡7月8日电(记者刘春涛)华侨银行投资策略常务董事华素梅农(Vasu Me...
【山西市场导报】小小电器巧解三... 小小电器巧解三伏“烤”验7月6日正午,太原被热浪紧紧裹住,太阳把迎泽大街的柏油路面晒得发软。家住老军...
湖北省政协原党组成员、副主席周... 转自:上观新闻湖北省政协原党组成员、副主席周先旺涉嫌严重违纪违法,目前正接受中央纪委国家监委纪律审查...
实现AI自主荐岗,朝阳区人社局... 转自:北京日报客户端日前,北京市朝阳区人力社保局创新推出的AI求职助手在抖音平台正式上线并投入使用。...
特别提醒!7月12日开考 转自:黑龙江发布黑龙江省2025年特岗教师招聘考试(文化课笔试)考前特别提醒  黑龙江省2025年特...
纯苯期货和期权在大商所挂牌上市 转自:新华财经新华财经北京7月8日电(记者 王小璐)2025年7月8日,纯苯期货和期权在大商所正式挂...
党建引领|海欣集团党委组织开展... 转自:海欣股份追寻红色足迹汲取前行力量主题党日活动在中国共产党成立104周年和陈云诞辰120周年之际...
澳大利亚商业状况和信心在央行决... 格隆汇7月8日|随着销售、盈利和就业大幅增长,澳大利亚的商业状况显著改善,企业信心也同步上升,显示出...
财务战线上的“红色算盘” 赵菊  财务工作常被称为“经济命脉的守护者”,中国航空工业集团安大综合管理室作为公司财务体系的“中枢...
雪祺电气在合肥成立供应链公司 转自:证券时报人民财讯7月8日电,企查查APP显示,近日,合肥雪祺供应链有限公司成立,法定代表人为顾...