需要用golang完成一个写入文件的程序,第一次用到os下的这些函数,给自己记个文档。
看源码的过程中,发现使用golang中的文件创建等函数,需要了解文件权限位的知识(ps:Java里从来就调个方法就解决了,从没仔细了解过),这里贴一个[讲解权限位](https://blog.csdn.net/devyfong/article/details/8066369)的博客。我使用的IDE是IntelliJ GoLand,看源码非常方便,推荐和我一样的初学者使用
### func Getwd() (dir string, err error) {...}
获得程序运行路径,相当于Linux下运行`pwd`命令
```
// 代码
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Getwd())
}
// 命令行执行
bogon:postback zhaoyf$ go run Application.go
/Users/zhaoyf/Code/go_path/src/adr-postback-consumer/postback <nil>
bogon:postback zhaoyf$ cd ~
bogon:~ zhaoyf$ go run Code/go_path/src/adr-postback-consumer/postback/Application.go
/Users/zhaoyf <nil>
```
### func IsNotExist(err error) bool {...}
判断err是否在提示文件或目录不存在
```
// ----- 源码
// error.go -> IsNotExist()
func IsNotExist(err error) bool {
return isNotExist(err)
}
// error_unix.go -> isNotExist() // 我的环境是Mac,可能其他系统文件名不同
func isNotExist(err error) bool {
err = underlyingError(err)
// 当代码看到这一步发现,这个方法是用来比较参数err是不是一个指定的错误
return err == syscall.ENOENT || err == ErrNotExist
}
// error.go -> underlyingError() // 返回已知os错误类型的底层错误
func underlyingError(err error) error {
switch err := err.(type) {
case *PathError:
return err.Err
case *LinkError:
return err.Err
case *SyscallError:
return err.Err
}
return err
}
```
### func Mkdir(name string, perm FileMode) error {...}
根据给定路径[name]创建文件夹,并通过perm指定文件夹的权限
```
// 自己封装的创建文件夹函数
func mkdir(path string) {
err := os.Mkdir(path, os.ModeDir)
// 当返回error时,且error不是文件已存在错误,打印错误信息
if err != nil && os.IsNotExist(err) {
fmt.Printf("[init] create log dir[%s] falied :%s\n", path, err)
}
}
```
### func OpenFile(name string, flag int, perm FileMode) (*File, error) {...}
返回可以执行 I/O 操作的方法,通过操作返回值的 *File 进行读写删,请注意代码中流资源的释放
```
// 具体常量代码篇幅太长,请根据如下所示自行寻找
// flag 取值 详见file.go -> 65行常量定义
// perm 取值 详见types.go -> 42行常量定义
```
### func Create(name string) (*File, error) {...}
不解释,直接看源码吧
```
func Create(name string) (*File, error) {
// 如果对 O_* 常量不理解,可以看上述 OpenFile() 函数中的 flag 取值
return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
```
### func (f *File) Write(b []byte) (n int, err error) {...}
写入文件,返回写入成功的字节数
```
// 偷个懒,示例直接贴 writeString() 函数的源码
// WriteString is like Write, but writes the contents of string s rather than
// a slice of bytes.
func (f *File) WriteString(s string) (n int, err error) {
return f.Write([]byte(s))
}
// 自己封装的写入文本的函数
func write(log string, filePath string) {
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil && os.IsNotExist(err) {
fmt.Printf("[write] create log file[%s] falied :%s\n", filePath, err)
}
defer file.Close()
file.WriteString(log + "\n")
}
```
### os.PathSeparator
文末加个小彩蛋,文件路径的分隔符,win用`\\` unix用`/`,为了避免在代码中写死造成的 bug,可以用这个常量代替
有疑问加站长微信联系(非本文作者))