golang 代码片段


原文链接: golang 代码片段

os.OpenFile 文件打开方式(flag)

O_RDONLY 以只读文式打开文件。
O_WRONLY 以只写方式打开文件。
O_RDWR 以读写方式打开文件
O_APPEND 以追加方式打开文件,写入的数据将追加到文件尾。
O_CREATE 当文件不存在时创建文件。
O_EXCL 与 O_CREATE 一起使用,当文件已经存在时 Open 操作失败。
O_SYNC 以同步方式打开文件。每次 write 系统调用后都等待实际的物理 I/O 完成后才返回,默认(不使用该标记)是使用缓冲的,也就是说每次的写操作是写到系统内核缓冲区中,等系统缓冲区满后才写到实际存储设备。
O_TRUNC 如果文件已存在,打开时将会清空文件内容。必须于 O_WRONLY 或 O_RDWR 配合使用。截断文件,需要有写的权限。

读取不存在的文件会报错

fd,err:=os.OpenFile("aaa", os.O_RDONLY, 0666)

读写文件,没有就创建

fd, err = os.OpenFile(curFileName, os.O_RDWR|os.O_CREATE, 0600) 

lf, err := os.OpenFile(errLog, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0600)

追加模式
f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_APPEND, 0666)

快速遍历当前文件夹和文件

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	upperDirPattern := "./*"
	matches, err := filepath.Glob(upperDirPattern)
	if err != nil {
		panic(err)
	}
	for _, file := range matches {
		fmt.Println(file)
	}
}

检查文件或目录是否存在

// 如果由 filename 指定的文件或目录存在则返回 true,否则返回 false
func fileExist(filename string) bool {
    _, err := os.Stat(filename)
    return err == nil || os.IsExist(err)
}
if _, err := os.Stat(dir); !os.IsNotExist(err) {
		t.Fatalf("dir should be gone: %v", err)
	}
```	

### 获取当前目录和父级目录
```go
func substr(s string, pos, length int) string {
	runes := []rune(s)
	l := pos + length
	if l > len(runes) {
		l = len(runes)
	}
	return string(runes[pos:l])
}

func getParentDirectory(dirctory string) string {
	return substr(dirctory, 0, strings.LastIndex(dirctory, "/"))
}

func getCurrentDirectory() string {
	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		log.Fatal(err)
	}
	return strings.Replace(dir, "\\", "/", -1)
}
`