os包既是有os相关的操作,那么什么是os操作呢?我们都知道,os是系统的意思,那么os操作自然是系统操作了。其实我们可有类比成一些物理操作,比如说,我们需要打开一个文件,新建一个文件,新建目录,删除文件,删除目录等。这些操作都是比较耗时的,因为系统要和电脑的磁盘打交道,所以会浪费一下时间。
在学习之前我们需要了解一下文件相关的权限,我们在使用os包的时候,打开文件时会有需要写入文件权限,那么这个文件的权限到底是怎么回事呢?这些使我们必须要掌握的知识。
文件的权限分为:r 读、w 写、x 执行
三种权限分别用0 、1 来表示开关,0既是关,1既是开。
三种权限的顺序也是rwx的顺序,如果是100,就表示:可读,不可写,不可执行,那么对应的十进制数字就是4。010,表示不可读,可写,不可执行,对应十进制2。001表示只可执行。
那么可读,可写,可执行便是最高的权限了,二进制111,十进制7。
但是,我们传入的参数好像都是四位数,比如0777,0666。那么这是怎么回事呢?
首位0我们先不做解释,先解释777,这明显是十进制。
上面我们说了7是最高权限,三个7是因为,对应三种角色的权限。分别是:文件所有者,文件所属组用户,其他用户。777就表示这三种角色的权限都是最高权限。如果是741,意思就是第一个角色是最高权限,第二个角色只读权限,第三个角色只能执行权限。
那么自己思考一下,666是怎么回事呢?对应二进制 110,110,110,对应的三个角色的权限都是可读可写不可执行。
os包
讲完了权限,我们可以开始讲os包了。
os包提供了文件的打开,关闭,删除,重名名方法
func Create(name string) (file *File, err error) |
Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。 |
open方法
func Open(name string) (file *File, err error) |
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。 |
func OpenFile(name string, flag int, perm FileMode) (file *File, err error) |
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。 |
rename
func Rename(oldpath, newpath string) error |
Rename修改一个文件的名字,移动一个文件。可能会有一些个操作系统特定的限制。 |
remove
func Remove(name string) error |
Remove删除name指定的文件或目录。如果出错,会返回*PathError底层类型的错误。 |
func RemoveAll(path string) error |
RemoveAll删除path指定的文件,或目录及它包含的任何下级对象。它会尝试删除所有东西,除非遇到错误并返回。如果path指定的对象不存在,RemoveAll会返回nil而不返回错误。 |
这些都是比较常用的方法。
同时os包中提供了一个os.File的结构体。该结构体实现了io包中的reader,writer接口,所以可以直接可以用进行io操作来读写。
比如我们打开了一个文件,想读取文件中的全部内容,我们可以使用os.File自身实现的read方法也可以使用ioutil或者bufio包中的方法。
代码如下:
import(
"os"
"io/ioutil"
"bufio"
"log"
)
func test(){
file,err:=os.Open("./hello.txt") //返回的file是os.File类型
if err != ni {
log.Fatal(err)
}
b, err := ioutil.ReadAll(file)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
}
func test(){
file,err:=os.Open("./hello.txt") //返回的file是os.File类型
if err != ni {
log.Fatal(err)
}
bufreader := bufio.NewReader(file)
for {
line, _, err := bufreader.ReadLine()
if err == io.EOF {
break
}
fmt.Println(string(line))
}
}
知道这些,其他的基本也能理解了。