os File的操作
几个操作:
os.NewFile(fd, "aName") 包装一个文件描述符,比如:uintptr(syscall.Stderr)
os.Create("fileName") 创建文件,如果文件已存在,会被清空内容
os.Open("fileName") 打开现有的文件,只读
os.OpenFile("fileName", OPERATION_MODE, FileMode) 创建或者打开文件
其中 os.Open 和 os.Create 都是 os.OpenFile 的封装,从源码可以看出他们的为啥具有对应的行为约束:
操作模式:
- os.O_RDONLY 只读不可写
- os.O_WRONLY 只写不可读,如果编辑为只写,对其调用Read()编译的时候不会报错,但是读不到内容。此时写会从0位置写入内容,如果原来有内容,会被覆盖。
- os.O_RDWR 可读可写。此时写入时,如果已经读取过内容,则会在最后读取/写入的位置后面写入(此处有个偏移量在控制,实际使用中可以使用os.Seek()来调整)。
- os.O_APPEND:当向文件中写入内容时,把新内容追加到现有内容的后边。
- os.O_CREATE:当给定路径上的文件不存在时,创建一个新文件。
- os.O_EXCL:需要与
os.O_CREATE
一同使用,表示在给定的路径上不能有已存在的文件。 - os.O_SYNC:在打开的文件之上实施同步I/O。它会保证读写的内容总会与硬盘上的数据保持同步。
- os.O_TRUNC:如果文件已存在,并且是常规的文件,那么就先清空其中已经存在的任何内容。
文件权限:
FileMode其实是uint32类型,其中低9位为文件权限。
比如0777是 rwxrwxrwx,0321是-wx-w---x。使用FileMode也实现了String()接口,可以打印出权限内容。
注意,为了确保权限设置正确,在使用中最好先使用syscall.Umask(0)清空mask内容。mask是权限的掩码限制,一般认为是为了限定用户设定文件的权限下限,比如mask为0022,那么FileMode为0666的时候,实际创建的文件是0666-0022=0644。