欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Golang的os标准库中常用函数的整理介绍

程序员文章站 2022-08-29 09:34:41
os.rename()这个函数的原型是func rename(oldname, newname string) error,输入的是旧文件名,新文件名,然后返回一个erro...

os.rename()这个函数的原型是func rename(oldname, newname string) error,输入的是旧文件名,新文件名,然后返回一个error其实这个函数的真正实现用的syscall.rename()然后通过movefile(from *uint16, to *uint16) (err error) = movefilew来重新命名

复制代码 代码如下:

 import (
 "fmt"
 "os"
)

func main() {
 err := os.rename("1.go", "2.go")
 if err != nil {
  if os.isexist(err) { //判断一个是否文件已经存在的错误
   fmt.println("文件已经存在")
   os.rename("1.go", "widuu_1.go")
  }
 }
}


os.samefile()这个函数的作用是检测文件的信息是否相同所谓文件信息指的是os.stat(),函数原型是func samefile(fi1, fi2 fileinfo) bool
举个例子
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 f1, _ := os.stat("1.go")
 f2, _ := os.stat("21.go")
 if os.samefile(f1, f2) {
  fmt.println("两个文件一样")
  return
 }
 fmt.println("两个文件不一样")
}


os.setenv()这个函数是设置环境变量的很简单,函数原型func setenv(key, value string) error输入对应的key-value字符串,返回error信息
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 err := os.setenv("wd_path", "d:/golang")
 if err != nil {
  fmt.println(err)
 }
 env := os.getenv("wd_path")
 fmt.println(env) //返回的是d:/golang
}


os.symlink()对于这个函数我只能说不支持windows平台的,创建软连接func symlink(oldname, newname string) error
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 err := os.symlink("1.go", "21.go") //不支持windows平台只支持linux和unix
 fmt.println(err)
}


os.tempdir()这个函数很简单,返回你本地的系统temp目录,函数原型func tempdir() string,嘿嘿,做个对比别乱了
复制代码 代码如下:

import (
 "fmt"
 "io/ioutil"
 "os"
)

func main() {
 //创建临时的tmp
 dir, _ := os.getwd()
 path, _ := ioutil.tempdir(dir, "tmp")
 fmt.println(path) //d:\test\tmp764030415
 //这个返回的是系统temp
 temp := os.tempdir()
 fmt.println(temp) //windows来说c:\users\admini~1\appdata\local\temp
}


os.truncate()改变文件的f.size()这个就改变了文件内容的长度了,函数原型func truncate(name string, size int64) error,记得哈第二个是int64
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 f, _ := os.stat("1.go")
 fmt.println(f.size())   //1.go 83
 err := os.truncate("1.go", 10) 
 if err != nil {
  fmt.println(err)
 }
 f, _ = os.stat("1.go")
 fmt.println(f.size())    //1.go现在是10 文件也变成了package ma
}


os.create()这个函数是创见一个文件,函数的原型是func create(name string) (file *file, err error)输入的是名称字符串类型,返回的是一个file的指针和一个error
复制代码 代码如下:

import (
 "fmt"
 "os"
 "reflect"
)

func main() {
 f, _ := os.create("widuu_2.go")
 defer f.close()
 fmt.println(reflect.valueof(f).type()) //*os.file
}


这个函数的原理其实是这样的openfile(name, o_rdwr|o_create|o_trunc, 0666) o_rdwr也就是说用读写的权限,o_create然后文件存在忽略,不存在创建它,o_trunc文件存在截取长度为0,这就解释了为什么我们明明有这个文件,我擦,创建之后哭了~啥都没有了~~用的时候需谨慎,先判断文件是否存在~

os.openfile函数的原型是func openfile(name string, flag int, perm filemode) (file *file, err error)要指定文件权限和打开的方式,就是我们上边所用到的

复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 f, _ := os.openfile("10.go", os.o_rdwr|os.o_create|os.o_trunc, 0777)
 defer f.close()
 fmt.println(f.stat())
}


这个就是上边的create()只不过权限是0777以及下边的操作等大部分用到openfile()

os.open()这个函数是打开文件使用的,函数原型是func open(name string) (file *file, err error),返回值就不说了一样的,它的其实原理是这样的openfile(name, o_rdonly, 0)以读文件的模式打开

复制代码 代码如下:

import (
 "fmt"
 "os"
 "reflect"
)

func main() {
 f, _ := os.open("1.go")
 defer f.close()
}


os.stat()这个是获取fileinfo的结构描述func stat(name string) (fi fileinfo, err error)返回了fileinfo这个结构,我们再前边也详细讲了
,其实它是怎么实现的呢?因为我们没讲syscall所以我们就讲一个,譬如fileinfo底层获取fs := &filestat{name: basename(name)}然后后边逻辑大家可以看源代码
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 f, _ := os.stat("1.go")
 fmt.println(f.size())
}


os.fd()返回文件的句柄,函数原型是func (file *file) fd() uintptr函数是这样的uintptr(file.fd) 返回的是文件的句柄,句柄是什么?句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 f, _ := os.open("1.go")
 fmt.println(f.fd()) //我的平台句柄是228
}


os.pipe()这个函数获取的函数的读写指针,函数原型func pipe() (r *file, w *file, err error)
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 r, w, _ := os.pipe()
 fmt.println(r, w) //&{0xc08402e120} &{0xc08402e180}
}


os.newfile()函数原型是func newfile(fd uintptr, name string) *file 第一个传入的是句柄,然后是文件名称,这个函数并不是真的创建了一个文件,是新建一个文件不保存,然后返回文件的指针
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 f, _ := os.open("ini.go")
 defer f.close()
 f1 := os.newfile(f.fd(), "ceshi.go") //输如ini.go的句柄
 defer f1.close()
 fd, _ := f1.stat()
 fmt.println(fd.modtime()) //返回的是ini.go的创建时间2013-11-27 09:11:50.2793737 +0800 cst

}


(f *file).chdir()修改工作目录,函数原型func (f *file) chdir() error,这个时候f必须是目录了,但是吧这个不支持windows
复制代码 代码如下:

import (
 "fmt"
 "os"
)

func main() {
 dir, _ := os.getwd()
 fmt.println(dir)
 f, _ := os.open("views")
 err := f.chdir()
 if err != nil {
  fmt.println(err)
 }
 dir1, _ := os.getwd()
 fmt.println(dir1)
}